如何从流(tcp)套接字读取确切的字节数?

时间:2009-11-15 22:28:00

标签: winapi winsock buffering recv

在winsock中,只要流套接字中有数据可用,sync recv和async WSARecv都会完成,无论指定的大小(仅为上限)。这意味着为了从流中读取固定数量的字节,应该应用一些自定义缓冲。除非每个读取单独缓冲,否则会导致双缓冲,即每个插槽实际上有两个缓冲区。

有没有办法让winsock代表自己缓冲数据,只有在指定的字节数可用时才完成操作(除非发生错误)?

编辑:此功能特别适用于异步套接字。

1 个答案:

答案 0 :(得分:4)

对于同步套接字,您应该能够将MSG_WAITALL标志传递给recv,它将阻塞,直到缓冲区已满或出现错误/断开连接。

关于重叠的io,然后不是真的。您唯一真正的选择是缓冲数据。不过,你真的不需要两个缓冲区;你可以使用相同的缓冲区,只传递最后一次读取结束的缓冲区+偏移量,直到填充缓冲区为止。