我正在尝试在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
?
答案 0 :(得分:1)
看起来你对UDP的运作方式感到困惑。
在TCP中,每个客户端都有一个套接字,每个会话的处理程序在接收连接时都会以accept()
传递给您。根本不是UDP的情况。
UDP不支持会话,它会传输独立的数据包。您只需读取来自poll_set[0].fd
的所有数据包,就像它已建立的会话一样。没有accept()
。
然后你问,我怎么知道谁在发送什么?很简单,你使用recvfrom()
和sendto()
代替recv()
和{{ 1}}。
除了分组数据之外,这些功能还将提供有关这些内容来自哪个IP地址的信息(以及远程端口,这对于来自相同IP的多个“会话”非常重要)。