sockets - 同时使用 accept() 和 select() ?

标签 sockets tcp network-programming

我有一个事件驱动的网络服务器程序。该程序接受来自其他主机上其他进程的连接。同一远程 IP 上的不同端口可能有许多短暂的连接。

目前,我有一个 while(1)调用 accept() 的循环然后生成一个线程来处理新连接。读取消息后关闭每个连接。在远程端,发送消息后关闭连接。

我想通过缓存打开的套接字 FD 来消除建立和拆除连接的开销。在发件人方面,这很简单 - 我只是不关闭连接,并保持它们在身边。

在接收端,有点难。我知道我可以存储 accept() 返回的 FD在结构中并使用 poll() 监听所有此类套接字中的消息或 select() , 但我想同时通过 accept() 监听新连接监听所有缓存的连接。

如果我使用两个线程,一个在 poll() 上还有一个在 accept() , 那么当 accept()调用返回(打开一个新连接),我必须唤醒等待旧连接集的另一个线程。我知道我可以用信号和 pselect() 来做到这一点,但是对于如此简单的事情来说,这整个困惑似乎太多了。

是否有调用或高级方法可以让我同时处理打开的新连接和旧连接上发送的数据?

最佳答案

我上次检查时,您可以在套接字上监听,然后选择轮询来查看是否有连接进来。如果所以,接受它;它不会阻塞(但你可能想要 真的应该设置 O_NONBLOCK 只是为了确定)

关于sockets - 同时使用 accept() 和 select() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3444729/

相关文章:

delphi - 如何为 IdTCPServer 分配 IP 地址?

java - 在关闭时可靠地关闭线程池中的客户端套接字

linux - FD_ISSET 在 FD_SET 之后返回 0

sockets - 了解NodeMcu固件存储库

c - TCP 连接断开检测(如果中间链路断开)?

c# - Messenger 默认关闭端口

java - 写入速度比从套接字读取速度快

networking - 为什么我的ip地址以192开头?

java - 使用套接字发送图像的最佳方式

java - Int 大小 字节 套接字 AS3