你需要有一個結構來紀錄每個 fd 上次讀了多少 byte等到該 fd 下次又可以讀取時,寫入時的 buffer 加上之前已經紀錄的 byte 數,當作是 offset 來寫入大多數的 non-blocking I/O multiplexing 都是這樣寫的目的就是每個 fd 都要被讀取一點,簡單點可以開一個array (e.g. size_t avaiLen[MAX_FDS]) 之類的作法把每次 read (or recv) 回傳的長度,針對fd作一個紀錄non-blocking I/O multiplexing 的重點就是要輪流讀取千萬不要寫 loop 硬是把資料給讀完,這樣就失去意義了另外,你得考慮你的通訊協定,或者實作一個自動狀態機進而得知當前讀取的 buf 已經可以進行 parse 之類的修正用語,是 FSM 有限狀態自動機。還有這篇文章可以看看,reactor pattern 就是你想要的
http://goo.gl/ULuXrX Reactor (Douglas C. Schmidt)另外,每個 fd 都要有自己的 buffer,這樣才能夠多工建議可以直接用一個結構來儲存 buf 跟 avaiLen 之類的e.g. struct ctx { char buf[8192]; size_t len; };