繁体   English   中英

C中带有poll()的UDP套接字服务器

[英]UDP socket server with poll() in C

我正在尝试使用C poll()使用非阻塞方式,但暂时跳过此点)与多个客户端进行通信的UDP服务器进行C语言编码。 在这里,我几乎不了解流程的基本概念(可以找到许多关于如何将轮询与TCP结合使用的示例,但找不到对UDP /轮询具有启发性的任何示例)。

所以我的理解如下:我有一个数组

struct pollfd poll_set[N];

初始化它

for (i = 0; i < MAX_NUMBER_OF_CLIENTS; ++i) {
       poll_set[i].fd = -1;
       poll_set[i].events = POLLIN;
       poll_set[i].revents = 0;
}

现在,我想我应该创建一个或多个套接字并对其进行绑定。 所以至少

poll_set[0].fd = socket(AF_INET, SOCK_DGRAM, 0);
if (poll_set[0].fd < 0)
    err(...);
if (bind(poll_set[0].fd,...) < 0)
    err(...);

在无休止的循环中,我进行事件检查工作:

for (;;) { 
    poll_ret = poll(poll_set, N, TIMEOUT);
    if (poll_ret > 0)
        "find element of poll_set[] where event occured and read from it"
}

但是什么时候以及如何创建套接字/将i = 1 .. N-1的元素poll_set[i]绑定?

看起来您对UDP的工作方式感到困惑。

在TCP中,每个客户端都有一个套接字,接收连接时,每个会话的处理程序都使用accept()交给您。 UDP根本不是这样。

UDP不支持会话,它传输独立的数据包。 您只需从poll_set[0].fd读取所有数据包poll_set[0].fd就像它是已建立的会话一样。 没有accept()

然后您问, 我怎么知道谁发送了什么? 很简单,您可以使用recvfrom()sendto()代替recv()send()

这些功能除了数据包数据外,还将提供有关填充物来自哪个IP地址的信息(以及远程端口,这对于在来自同一IP的多个“会话”的情况下非常重要)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM