我正在使用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));
}
}
}
想知道处理多个传入UDP连接的最佳方法是什么。
在这里要小心你的想法。UDP 中没有连接。只有主机发送的数据包。
目前,Im使用带有recv的while循环,连接的数据和IP地址存储在数组中。
查看select
系统调用。这是为等待一个或多个文件描述符(套接字(而设计的。
http://man7.org/linux/man-pages/man2/select.2.html
因此,有一些连接可能会丢失。
您的意思是有可能丢弃数据包。这就是UDP的本质。在 UDP 上构建的任何应用程序都必须预期某些数据包会丢失,并且数据包将以发送到的顺序不同。
那么是否可以使用单个插座来做到这一点?
是的
如果我使用多个线程,是否有可能单个连接被多个线程中的套接字接受?
UDP 套接字在 TCP 套接字的意义上不被"接受"。我建议在完全了解域之前不要使用多个线程。
在某些对压力不敏感的情况下,您可以使用select(( 系统调用来管理多个描述符,并使用epoll(( 来管理重载系统。
顺便说一句:与TCP描述符不同,使用前不接受。因此,您应该确切地知道对等或广播地址。