Winapi 当调用winsock中的recv函数并且没有收到所有数据时,会发生什么情况?

Winapi 当调用winsock中的recv函数并且没有收到所有数据时,会发生什么情况?,winapi,winsock,Winapi,Winsock,从我所读到的有关winsock的内容来看,recv有一种倾向,即不会在一次呼叫中接收来自发送方的所有数据。当人们这样说时,他们的意思是,例如,我从客户端发送300字节,在服务器上调用recv,它可能在第一次调用时只能接收200多个字节,而缓冲区将被这200个字节填满?最后100个字节会发生什么变化 另外,假设缓冲区太小,比如512字节之类,客户端发送600字节。第一个recv调用是否会将缓冲区填充到容量,然后丢弃最后88个字节?如果我使用不同的缓冲区再次调用recv,该缓冲区的前88个字节将是数

从我所读到的有关winsock的内容来看,recv有一种倾向,即不会在一次呼叫中接收来自发送方的所有数据。当人们这样说时,他们的意思是,例如,我从客户端发送300字节,在服务器上调用recv,它可能在第一次调用时只能接收200多个字节,而缓冲区将被这200个字节填满?最后100个字节会发生什么变化

另外,假设缓冲区太小,比如512字节之类,客户端发送600字节。第一个recv调用是否会将缓冲区填充到容量,然后丢弃最后88个字节?如果我使用不同的缓冲区再次调用recv,该缓冲区的前88个字节将是数据的其余部分吗

第三,如果1和2是真的,并且我在不同的缓冲区中接收到一整包数据,我是否必须将它们拼接到一个缓冲区中,以开始从中解析数据?

我在这里假设TCP

它是否可能在第一次调用时只能接收200多个字节,而缓冲区将被这200个字节填满

最后100个字节会发生什么变化

下次你会收到的

另外,假设缓冲区太小,比如512字节之类,客户端发送600字节。第一个recv调用是否会将缓冲区填充到容量,然后丢弃最后88个字节

没有

如果我使用不同的缓冲区再次调用recv,前88个字节是否将是数据的其余部分

第三,如果1和2是真的,并且我在不同的缓冲区中接收到整个数据包,我是否必须将它们拼接到一个缓冲区中,以开始从中解析数据


这取决于你。您需要在一个连续的缓冲区中存储数据吗?如果是的话,是的。

哇,这一定是我在这个网站上得到的最快、最直接的回复。谢谢你的澄清。你和这个场地岩石PTBH,这是因为问题清楚易懂,@James能够给出简洁准确的回答。如果所有的问题都那么清楚的话:(稍微详细说明一下,每次调用
recv
都可以接收到从1到请求的缓冲区大小的任何内容。无论发送的是什么“块”,都可能发生这种情况,并且可能是由链接速度慢、数据包碎片、服务器写得不好等原因造成的。