加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在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是将被此变量定义屏蔽的套接字函数的名称.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读