使用单个套接字处理多个传入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 设计模式?

在 C++ 中处理单个服务器和多个客户端

多个套接字可以与 UDP 的同一端口相关联吗?

为 UDP 模拟 accept()(设置解复用 UDP 套接字的时间问题)

尝试连接到已经处理请求的套接字的传入连接会发生啥?

python - 如何在一个套接字上使用传入数据流来处理Python中的多个并行进程?