使用单个套接字处理多个传入UDP连接
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用单个套接字处理多个传入UDP连接相关的知识,希望对你有一定的参考价值。
我正在使用C ++,并想知道处理多个传入UDP连接的最佳方法。当我的意思是多重时,它可能是几百甚至几千。目前我使用带有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中没有连接。主机发送的数据包很简单。
目前我使用带有recv的while循环,连接的数据和IP地址存储在一个数组中。
看看select
系统调用。这是为等待一个或多个文件描述符(套接字)而设计的。
http://man7.org/linux/man-pages/man2/select.2.html
所以有可能会有一些联系迷失。
你的意思是有可能丢弃数据包。这是UDP的本质。您在UDP上构建的任何应用程序都必须预期某些数据包会丢失,并且数据包将以与它们发送的顺序不同的方式到达。
那么用单插槽可以做到这一点吗?
是
如果我使用多个线程,多个线程中的套接字是否有可能接受单个连接?
在TCP套接字的意义上,UDP套接字不被“接受”。在你完全理解域之前,我建议不要使用多个线程。
您可以使用select()系统调用来管理一些压力不敏感环境下的多个描述符,以及epoll()用于重载系统。
BTW:与TCP描述符不同,使用前没有接受。所以你应该确切地知道对等或广播地址。
以上是关于使用单个套接字处理多个传入UDP连接的主要内容,如果未能解决你的问题,请参考以下文章
是否有在单个活动中处理多个片段的 Android 设计模式?