所以我完全失去了它,當有人使用select()像我展示了一些代碼:SOCKET文件描述
FD_ZERO(&readfds);
FD_SET(socket,&readfds);
FD_SET(0,&readfds);
.......// bind() and listen(),regular stuff
// Before select(),this guy cleared readfds to null and sort of start all over again
FD_ZERO(&readfds);// Behold,this is exactly the line confusing myself
FD_SET(socket,&readfds);
// select will be called in the future within a infinite loop
所以基本上說什麼FD_ZERO
綁定後,聽是由於某種原因,明確以前的內容,並插入插座文件描述符再次設置爲fd。同時,在fd集中,0描述符(標準輸入)顯然消失。
誰能解釋這件事?我不覺得這是正確的,但我不能真正弄清楚。也許再次設置一些特定的FD設置是一種實際的機制...
我認爲bind()
和listen()
可以修改fd集以某種方式。我設置了幾個斷點,並檢查輸出。隨後,FD集沒有改變。
UPDATE:
真正讓我困惑的是第二FD_ZERO(&readfds)
。 顯然,第一個就像在緩衝區中清理生鏽的東西。在每次迭代中,我們必須將fdset清除爲未來的默認值。我只是不理解第二個。要麼是錯誤的,要麼不會傷害到任何人。
'select'會改變fdset,但'bind'和'listen'不能,它們甚至沒有指向它的指針。但是請自己幫忙,並使用像'poll'或'epoll'這樣的現代API,並且不要再擔心fdset。 – 2012-02-23 03:18:23
聽起來很酷,但我不能得到它 – jasonkim 2012-02-23 03:20:57
使用'民意測驗'。它現代,便攜和快速。 'epoll'僅用於基準自我愉悅,它擅長的基準測試不符合大多數真實世界的使用需求(其中'epoll'實際上比'poll'慢得多)。 – 2012-02-23 03:50:41