我有一个TCP服务器应用程序,在接收传入连接时,我接受连接并将套接字描述符添加到列表中。服务器需要列表,因此它可以遍历列表并定期向所有连接的客户端发送数据。
如果任何客户端关闭连接,则需要从列表中删除相应的套接字描述符。
我已经尝试将描述符添加到poll(),因此我可以检测到任何已关闭的连接可能是POLLHUP,但我无法弄清楚如何中断轮询以在每个传入的新连接上动态地将描述符添加到其集合中。 / p>
只要想要发送数据,服务器就只需要所有打开连接的描述符列表。
我该如何解决这个问题?有什么建议吗?
编辑:这就是我所做的:我为每个客户创建了一个线程,并将其fd添加到poll中。 服务器上的伪代码:sockfd = accept the conn.
pthread_create
// Inside the thread, add sockfd to poll
struct pollfd fds[1];
fds[0].fd = sockfd;
poll(fds, 1, 500000);
Check for POLLHUP returned event and see which client(fd) closed the connection.
这似乎是对所有描述符进行轮询,但我现在的问题是,当我测试用两个客户端关闭连接时...只有一个描述符返回POLLHUP。
答案 0 :(得分:3)
我无法弄清楚如何中断轮询以动态添加 每个传入的新连接上设置的描述符
您应该监视侦听套接字的活动。一旦poll
取消阻止,您检查的第一件事是“我的监听套接字变得有趣吗?”。如果是,请接受并添加到poll
和您自己的列表。