在C中使用poll()的UDP套接字服务器

时间:2017-05-05 13:14:51

标签: c server udp

我正在尝试在C中编写UDP服务器,该服务器将使用poll()(以非阻塞方式但暂时跳过此方式)与多个客户端进行通信。我几乎没有掌握流程方案的基本概念(可以找到许多如何使用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"
}

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

1 个答案:

答案 0 :(得分:1)

看起来你对UDP的运作方式感到困惑。

在TCP中,每个客户端都有一个套接字,每个会话的处理程序在接收连接时都会以accept()传递给您。根本不是UDP的情况。

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

然后你问,我怎么知道谁在发送什么?很简单,你使用recvfrom()sendto()代替recv()和{{ 1}}。

除了分组数据之外,这些功能还将提供有关这些内容来自哪个IP地址的信息(以及远程端口,这对于来自相同IP的多个“会话”非常重要)。