使用单个套接字处理多个传入的UDP连接

时间:2018-09-01 07:02:55

标签: c++ multithreading sockets udp

我正在使用C ++,想知道什么是处理多个传入UDP连接的最佳方法。当我的意思是倍数时,可能是几百甚至几千。目前,Im使用带有recv的while循环,将连接的数据和IP地址存储到数组中。因此,有可能会丢失一些连接。那么有可能用一个插座做到这一点吗?如果我使用多个线程,那么单个连接是否有可能被多个线程中的套接字接受?到目前为止,这就是我所拥有的,谢谢!

    time_t timeout = time(NULL);
    vector<string> ip_list;

    while(time(NULL) <= timeout + 60) {
        if (recv_len = recvfrom(ser_sock, recv_data, recv_size, 0, (struct sockaddr *)&cli_info, &cli_size) == SOCKET_ERROR) {
            printf("[WARNING] recv error occured.\n");
            continue;
        }

        if(strcmp(recv_data, "Save IP") == 0) {
            ip_list.push_back(inet_ntoa(cli_info.sin_addr));
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

  

想知道什么是处理多个传入UDP连接的最佳方法。

请谨慎思考。 UDP中没有连接。仅仅是主机发送的数据包。

  

当前,Im使用带有recv的while循环,将连接的数据和IP地址存储到数组中。

看看select系统调用。旨在等待一个或多个文件描述符(套接字)。

http://man7.org/linux/man-pages/man2/select.2.html

  

因此有可能失去一些连接。

您的意思是数据包有可能被丢弃。这就是UDP的本质。您在UDP上构建的任何应用程序都必须期望某些数据包丢失,并且这些数据包将以与发送时不同的顺序到达。

  

那么有可能用一个插座来做到这一点吗?

  

如果我使用多个线程,那么单个连接是否有可能被多个线程中的套接字接受?

就TCP套接字而言,不“接受” UDP套接字。在您完全了解该域之前,我建议您不要使用多个线程。

答案 1 :(得分:0)

您可以使用 select ()系统调用在不敏感压力的情况下管理多个描述符,而使用 epoll ()处理重载系统。

BTW:与TCP描述符不同,在使用之前不接受。因此,您应该确切知道对等地址或广播地址。