我正在使用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));
}
}
}
答案 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描述符不同,在使用之前不接受。因此,您应该确切知道对等地址或广播地址。