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

Winapi 如何从流(tcp)套接字读取准确的字节数?,winapi,winsock,buffering,recv,Winapi,Winsock,Buffering,Recv,在winsock中,只要流套接字中有可用数据,同步recv和异步WSARecv都会完成,而不管指定的大小(这只是上限)。这意味着为了从流中读取固定数量的字节,应该应用一些自定义缓冲。除非每个读取单独缓冲,否则会导致双缓冲,即每个套接字实际上有两个缓冲 有没有办法让winsock自己缓冲数据,并且只在指定的字节数可用时完成操作(除非发生错误) 编辑:此功能尤其适用于异步套接字。对于同步套接字,您应该能够将MSG_WAITALL标志传递给recv,它将阻塞,直到缓冲区已满或出现错误/断开连接 关于重

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

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


编辑:此功能尤其适用于异步套接字。

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


关于重叠io,则不太可能。您唯一的实际选择是缓冲数据。不过,您实际上不需要两个缓冲区;您可以使用相同的缓冲区,只需传递上次读取结束时的缓冲区+偏移量,直到缓冲区已填充。

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


关于重叠io,则不太可能。您唯一的实际选择是缓冲数据。不过,您实际上不需要两个缓冲区;您可以使用相同的缓冲区,只需传递上次读取结束时的缓冲区+偏移量,直到缓冲区被填满。

这似乎是阻止套接字的解决方案,但根据MSDN,异步套接字不支持它。请参阅编辑。它似乎是阻止套接字的解决方案,但根据MSDN,异步套接字不支持它。请参见编辑。