我有一個事件驅動的網絡服務器程序。該程序接受來自其他主機上其他進程的連接。同一個遠程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