2009-11-15 172 views
0

在winsock中,無論指定的大小(只是上限),只要流套接字中有可用數據,就立即同步完成同步recv和異步WSARecv。這意味着爲了從流中讀取固定數量的字節,應該應用一些自定義緩衝。除非每次讀取都被單獨緩衝,否則會導致雙重緩衝,即每個套接字實際上有兩個緩衝區。如何從流(tcp)套接字讀取確切的字節數?

有什麼辦法可以讓winsock以自己的名義緩存數據,只有在指定的字節數可用時纔會完成操作(除非發生錯誤)?

編輯:此功能應該特別適用於異步套接字。

回答

4

對於同步套接字,您應該能夠將MSG_WAITALL標誌傳遞給recv,該標誌將阻塞,直到緩衝區已滿或發生錯誤/斷開連接。

關於重疊的io,那麼不是真的。你唯一真正的選擇是緩衝數據。儘管如此,你並不需要兩個緩衝區。您可以使用相同的緩衝區,只需傳遞最後一次讀取結束的緩衝區+偏移量,直到緩衝區已填滿。

+0

它似乎是阻止套接字的解決方案,但根據MSDN它不支持異步套接字。請參閱編輯。 – sold 2009-11-15 22:40:40

+0

我相應地更新了我的答案。 – Gerald 2009-11-15 23:02:16