2009-11-15 127 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