回覆列表
-
1 # nnvcvhcdd
-
2 # 使用者7591485334113
首先需要指出的是您迴圈的一開始有一個步驟您漏掉了FD_ZERO(&readfds),原因是因為這個結構是一個類似bitmap的結構,select每次返回會修改這個bitmap把fd對應的位置上的標識置1,然後你拿到這個bitmap依次按位與您的read FDs集合,為真就說明這個fd被觸發了。正因為這個bitmap就造成了select無法準確告訴您哪些fd被激活了,而只能透過把所有的fd對照這個bitmap來一次邏輯計算,更進一步造成了select程式設計中經典的雙遍歷(當然這也是select的效率會隨著fds增長而下降的罪魁禍首)。
仔細對照一下標準流程,您的第一次遍歷貌似大有問題呢,如果有多個客戶端fd,您的程式碼只會新增一個到監聽佇列(最後進來的那一個)。好說了一下流程和您的程式碼,在下試圖分析一下為什麼會出現你在debug碰到的“邪門”事件。分兩種情況情況1:client1:連線————寫“你好”client2:————————————連線————寫“你們好”情況2:client1:連線————————寫“你好”client2:——連線———寫“你們好考慮第一種情況,client1連線進來,然後立即寫”你好“,沒有問題可以收到,然後client2進來,此時client1已經被client2頂掉了,然後client2寫”你們好“於是都可以收到”你們好“,但是client1再寫已經收不到了。考慮第二種情況,client1連線,然後client2進來,此時client1的fd被頂替了,於是怎麼都只能收到client2的”你們好“當然真實的情況還不只兩種,您可以套用它再去分析,相信屆時所有”詭異“的”邪門“的謎底都將無處遁形。
select鍵就是Page up。GBA模擬器VBA預設的SELECT是鍵盤的Backspace鍵。可以自己設定GBA的按鍵,執行模擬器,在選單按照選擇>手柄>設定>1的選單下設定按鍵。select英 [sɪˈlekt] 美 [sɪˈlɛkt] 1.The floorcovering you select will need to be impervious to water. 挑選的地板材料必須是防水的。2.A ferocious battle to select a new parliamentary candidate is in progress. 推選一位新的議會候選人的激戰正酣。3.Christian Lacroix is throwing a very lavish and very select party. 克里斯汀·拉克魯瓦正在舉辦一個非常豪華的上流聚會。