在winsock中,只要流套接字中有数据可用,sync recv
和async WSARecv
都会完成,无论指定的大小(仅为上限)。这意味着为了从流中读取固定数量的字节,应该应用一些自定义缓冲。除非每个读取单独缓冲,否则会导致双缓冲,即每个插槽实际上有两个缓冲区。
有没有办法让winsock代表自己缓冲数据,只有在指定的字节数可用时才完成操作(除非发生错误)?
编辑:此功能特别适用于异步套接字。
答案 0 :(得分:4)
对于同步套接字,您应该能够将MSG_WAITALL标志传递给recv,它将阻塞,直到缓冲区已满或出现错误/断开连接。
关于重叠的io,然后不是真的。您唯一真正的选择是缓冲数据。不过,你真的不需要两个缓冲区;你可以使用相同的缓冲区,只传递最后一次读取结束的缓冲区+偏移量,直到填充缓冲区为止。