比方說,我有一個服務器程序,可以接受來自10個(或更多)不同客戶端的連接。客戶隨機發送服務器收到的數據,但可以肯定的是每次更新至少有一個客戶端會發送數據。服務器不能等待信息到達,因爲它有其他處理要做。除了使用異步套接字外,我還看到了兩個選項:使用多個套接字,是非阻塞或阻塞與選擇更好?
使所有套接字非阻塞。在一個循環中,在每個套接字上調用
recv()
,並且如果沒有可用的數據並且如果我碰巧獲取一些數據,則允許它與WSAEWOULDBLOCK
一起失敗,然後保留它。將套接字留作阻塞。將所有插座添加到
FD_SET
並致電select()
。如果返回值不爲零(大部分時間),請遍歷所有套接字以找到適當數量的可讀套接字,其中FD_ISSET()
只能在可讀套接字上調用recv()
。
第一個選項將創建更多的recv()
函數調用。第二種方法是從編程的角度來看更大的痛苦,因爲所有的FD_SET
和FD_ISSET
循環。
哪種方法(或其他方法)是首選?避免讓recv()
在無阻塞的套接字上失敗的開銷值得稱呼select()
的麻煩?
我想我理解了這兩種方法,並且我都嘗試了成功,但我不知道是否有一種方法被認爲是更好或最優。
謝謝。對於這個實現,我不想使用Overlapped IO,但是謝謝你的建議。我會研究這一點。我瞭解你的建議,使用非阻塞模式和選擇()。我的主要問題是我應該無緣無故地致電recv,或者通過調用select()的動作。謝謝回覆! – JPhi1618 2009-10-06 17:30:37
更新了一點,以便更清楚 - 只需循環「recv()」即可將CPU固定在100%,這絕不是一件好事。 – bdonlan 2009-10-06 21:02:53