aspcms 手机网站,建设企业小程序多少钱,wordpress 伪静态 seo,西安专业做网站建设UDP 是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在 UDP 的情况下#xff0c;虽然可以确保发送消息的大小#xff0c;却不能保证消息一定会到达。因此#xff0c;应用有时会根据自己的需要进行重发处理。
1.UDP协议的主要特点#xff1a;
#xf… UDP 是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在 UDP 的情况下虽然可以确保发送消息的大小却不能保证消息一定会到达。因此应用有时会根据自己的需要进行重发处理。
1.UDP协议的主要特点
1UDP是无连接的可以减少开销和发送数据之前的时延。
2UDP使用尽最大努力交付不保证可靠交付主机不需要维持复杂的连接状态表。
3UDP是面向报文的一次交付一个完整的报文。
4UDP没有拥塞控制因此网络出现的拥塞不会使得源主机的发送速率降低。
5UDP支持一对一、一对多、多对一、多对多的交互通信。
6UDP的首部开销小只有八字节。
2.函数接口
1recvfrom()接收数据 ssize_t recvfrom(int sockfd,void*buf,size_t len,int flags,struct sockaddr * src_addr,socklen_t * addrlen); 参数说明 sockfd套接字描述符 buf:接收缓存区的首地址 len接收缓存区的大小 flags0//调用方式标志位 src_addr:发送端的网络信息结构体的指针 addrlen发送端的网络信息结构体的大小的指针 返回值 成功接收的字节个数 失败-1 0:客户端退出 2sendto()发送数据 ssize_t sendto(int sockfd,constvoid*buf,size_t len,int flags,const struct sockaddr* dest_addr,socklen_t addrlen); 参数说明 sockfd套接字描述符 buf:发送缓存区的首地址 len发送缓存区的大小 flags0 src_addr:接收端的网络信息结构体的指针 addrlen接收端的网络信息结构体的大小 返回值 成功发送的字节个数 失败-1 3.示例 服务端
#include stdio.h
#include stdlib.h
#include string.h
#include unistd.h
#include arpa/inet.h#define MAX_BUFFER_SIZE 1024
#define SERVER_PORT 8888int main() {int sockfd;struct sockaddr_in server_addr, client_addr;char buffer[MAX_BUFFER_SIZE];// 创建UDP套接字if ((sockfd socket(AF_INET, SOCK_DGRAM, 0)) 0) {perror(socket creation failed);exit(EXIT_FAILURE);}memset(server_addr, 0, sizeof(server_addr));memset(client_addr, 0, sizeof(client_addr));// 设置服务器地址和端口server_addr.sin_family AF_INET;server_addr.sin_addr.s_addr INADDR_ANY;server_addr.sin_port htons(SERVER_PORT);// 绑定服务器地址和端口if (bind(sockfd, (const struct sockaddr*)server_addr, sizeof(server_addr)) 0) {perror(bind failed);exit(EXIT_FAILURE);}printf(Server running on port %d...\n, SERVER_PORT);while (1) {// 接收来自客户端的数据memset(buffer, 0, sizeof(buffer));socklen_t client_len sizeof(client_addr);ssize_t message_size recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*)client_addr, client_len);if (message_size 0) {perror(recvfrom failed);exit(EXIT_FAILURE);}// 打印客户端发送的数据printf(Client message: %s\n, buffer);// 向客户端发送响应if (sendto(sockfd, buffer, message_size, 0, (struct sockaddr*)client_addr, sizeof(client_addr)) 0) {perror(sendto failed);exit(EXIT_FAILURE);}}// 关闭套接字close(sockfd);return 0;
}客户端
#include stdio.h
#include stdlib.h
#include string.h
#include unistd.h
#include arpa/inet.h#define MAX_BUFFER_SIZE 1024
#define SERVER_IP 127.0.0.1
#define SERVER_PORT 8888int main() {int sockfd;struct sockaddr_in server_addr;char buffer[MAX_BUFFER_SIZE];// 创建UDP套接字if ((sockfd socket(AF_INET, SOCK_DGRAM, 0)) 0) {perror(socket creation failed);exit(EXIT_FAILURE);}memset(server_addr, 0, sizeof(server_addr));// 设置服务器地址和端口server_addr.sin_family AF_INET;server_addr.sin_addr.s_addr inet_addr(SERVER_IP);server_addr.sin_port htons(SERVER_PORT);// 从标准输入读取数据printf(Enter message: );fgets(buffer, MAX_BUFFER_SIZE, stdin);// 发送数据到服务器sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr*)server_addr, sizeof(server_addr));// 等待接收服务器的响应memset(buffer, 0, sizeof(buffer));recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL);// 打印服务器的响应printf(Server response: %s\n, buffer);// 关闭套接字close(sockfd);return 0;
}