我有一个事件驱动的网络服务器程序。该程序接受来自其他主机上其他进程的连接。同一远程 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/