我有一个事件驱动的网络服务器程序。该程序接受来自其他主机上其他进程的连接。同一个远程IP上的不同端口可能会有很多短暂的连接。同时使用accept()和select()?
目前,我有一个while(1)
循环,它调用accept()
,然后产生一个线程来处理新的连接。读取消息后,每个连接都将关闭。在远程端,连接在发送消息后关闭。
我想消除设置和通过缓存打开的套接字文件描述符拆除连接的开销。在发件人方面,这很容易 - 我只是不关闭连接,并保持它们。
在接收端,这有点困难。我知道我可以将accept()
返回的FD存储在一个结构中,并使用poll()
或select()
监听所有此类套接字上的消息,但我想同时通过accept()
和监听所有缓存连接的新连接。
如果我使用两个线程,一个在poll()
,一个在accept()
,那么当accept()
调用返回(一个新的连接被打开),我要唤醒其他线程等待旧的连接集。我知道我可以用信号和pselect()
来做到这一点,但是对于一些如此简单的事情来说,这种混乱看起来像是太多的工作。
是否有电话或优越的方法,可以让我同时处理被打开新的连接和旧的连接发送的数据?
嗯,这是一个众所周知的竞争条件 - 在'接受(2)如果客户端下降的两次系统调用之间的连接尝试'将阻止。你*需要*监听套接字是非阻塞的。 – 2010-08-10 00:35:25
这是正确的 - 你可以在你的'select()'调用中将你的监听文件描述符添加到'readfds'中,如果文件描述符有连接准备好,''接受()'。 @Nikolai也是正确的 - 监听套接字应该是非阻塞的并且'accept()'调用准备处理'EAGAIN'。 – caf 2010-08-10 00:35:36