在udp服务器中接收最新的数据包 – C.
发布时间:2020-12-16 07:17:21 所属栏目:百科 来源:网络整理
导读:UDP服务器正在使用select系统调用接收数据包.我想从每个UDP客户端收到最新的数据包. (我也想听多个UDP客户端数据包). 我的简单UDP服务器的代码: int main(void) { int fd; int port = 5678; char buffer[1024]; fd_set readfs; socklen_t client_length; st
UDP服务器正在使用select系统调用接收数据包.我想从每个UDP客户端收到最新的数据包. (我也想听多个UDP客户端数据包).
我的简单UDP服务器的代码: int main(void) { int fd; int port = 5678; char buffer[1024]; fd_set readfs; socklen_t client_length; struct timeval timeout_interval; struct sockaddr_in6 server_addr; struct sockaddr_in6 client_addr; int result; int recv; char client_addr_ipv6[100]; fd = socket(PF_INET6,SOCK_DGRAM,0); printf(" e[1m e[34m ---------------------------------------- n-------------------- UDP SERVER --------------------n e[39m e[0m n"); printf("Process: e[34m %d e[49m Port ..n",port); if (fd < 0) { printf("ERR: fd < 0"); } else { memset(&server_addr,sizeof(server_addr)); server_addr.sin6_family = AF_INET6; server_addr.sin6_addr = in6addr_any; server_addr.sin6_port = htons(port); memset(&client_addr,sizeof(client_addr)); client_addr.sin6_family = AF_INET6; client_addr.sin6_addr = in6addr_any; client_addr.sin6_port = htons(port); if (bind(fd,(struct sockaddr *) &server_addr,sizeof(server_addr)) >= 0) { printf("e[1m INFO: e[0m e[34m Bind success.. e[39mn"); } else { printf("Bind."); return -1; } for (;;) { FD_ZERO(&readfs); FD_SET(fd,&readfs); int max_fd = MAX(0,fd); timeout_interval.tv_sec = 3; timeout_interval.tv_usec = 50000000; result = select(max_fd + 1,&readfs,NULL,&timeout_interval); //printf("n %d t %d n",result,fd); if (result < 0) { printf("ERRn"); } else if (result == 0) { printf("nTimeoutn"); } else { if (FD_ISSET(fd,&readfs)) { client_length = sizeof(client_addr); if ((recv = recvfrom(fd,buffer,sizeof(buffer),(struct sockaddr *) &client_addr,&client_length)) < 0) { printf("Recv-ERR!"); break; } inet_ntop(AF_INET6,&(client_addr.sin6_addr),client_addr_ipv6,100); //printf("Client IP/Port : %s ",client_addr_ipv6); printf("n ------------------------------------------ n"); printf("e[1m Data: e[0m e[32m %.*s n Client IP/Port : e[34m %s / %d ne[39m",recv,ntohs(client_addr.sin6_port)); } } } } } 解决方法
处理此问题的最佳方法是让发件人在每个数据包中放置一个序列号.对于发出的每个数据包,序列号增加1.
在接收方,您将跟踪收到的最后一个数据包的计数器.如果下一个数据包有一个更大的计数器,它是最新的.如果它不大,它是一个较旧的数据包,您可以以适当的方式处理它的应用程序. 此外,您应该将recv变量重命名为recv_len. recv是将被此变量定义屏蔽的套接字函数的名称. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |