Winapi 如何从流(tcp)套接字读取准确的字节数?
在winsock中,只要流套接字中有可用数据,同步Winapi 如何从流(tcp)套接字读取准确的字节数?,winapi,winsock,buffering,recv,Winapi,Winsock,Buffering,Recv,在winsock中,只要流套接字中有可用数据,同步recv和异步WSARecv都会完成,而不管指定的大小(这只是上限)。这意味着为了从流中读取固定数量的字节,应该应用一些自定义缓冲。除非每个读取单独缓冲,否则会导致双缓冲,即每个套接字实际上有两个缓冲 有没有办法让winsock自己缓冲数据,并且只在指定的字节数可用时完成操作(除非发生错误) 编辑:此功能尤其适用于异步套接字。对于同步套接字,您应该能够将MSG_WAITALL标志传递给recv,它将阻塞,直到缓冲区已满或出现错误/断开连接 关于重
recv
和异步WSARecv
都会完成,而不管指定的大小(这只是上限)。这意味着为了从流中读取固定数量的字节,应该应用一些自定义缓冲。除非每个读取单独缓冲,否则会导致双缓冲,即每个套接字实际上有两个缓冲
有没有办法让winsock自己缓冲数据,并且只在指定的字节数可用时完成操作(除非发生错误)
编辑:此功能尤其适用于异步套接字。对于同步套接字,您应该能够将MSG_WAITALL标志传递给recv,它将阻塞,直到缓冲区已满或出现错误/断开连接
关于重叠io,则不太可能。您唯一的实际选择是缓冲数据。不过,您实际上不需要两个缓冲区;您可以使用相同的缓冲区,只需传递上次读取结束时的缓冲区+偏移量,直到缓冲区已填充。对于同步套接字,您应该能够将MSG_WAITALL标志传递给recv,它将阻塞,直到缓冲区已满或出现错误/断开连接
关于重叠io,则不太可能。您唯一的实际选择是缓冲数据。不过,您实际上不需要两个缓冲区;您可以使用相同的缓冲区,只需传递上次读取结束时的缓冲区+偏移量,直到缓冲区被填满。这似乎是阻止套接字的解决方案,但根据MSDN,异步套接字不支持它。请参阅编辑。它似乎是阻止套接字的解决方案,但根据MSDN,异步套接字不支持它。请参见编辑。