当调用winsock 中的recv 函数并且没有收到所有数据时会发生啥?

Posted

技术标签:

【中文标题】当调用winsock 中的recv 函数并且没有收到所有数据时会发生啥?【英文标题】:what happens when the recv function in winsock is called and not all the data has been received?当调用winsock 中的recv 函数并且没有收到所有数据时会发生什么? 【发布时间】:2012-04-10 23:19:42 【问题描述】:

根据我所阅读的有关winsock 的信息,recv 倾向于在一次调用中无法接收来自发件人的所有数据。当人们这么说时,他们的意思是,例如,我从客户端发送 300 个字节并在服务器上调用 recv,它可能在第一次调用时只能接收 200 个字节,缓冲区将被这 200 个字节填充?最后 100 个字节会发生什么?

另外,假设缓冲区太小,例如 512 字节或其他内容,客户端发送 600。第一次 recv 调用是否会将缓冲区填满,然后只删除最后的 88 字节?如果我用不同的缓冲区再次调用 recv,该缓冲区的前 88 个字节会是其余的数据吗?

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

【问题讨论】:

【参考方案1】:

我在这里假设 TCP。

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

是的。

最后 100 个字节会发生什么?

下次你会收到的。

另外,假设缓冲区太小,如 512 字节或其他内容,而客户端发送 600。第一次 recv 调用是否会将缓冲区填充到容量,然后只删除最后的 88 字节?

没有。

如果我用不同的缓冲区再次调用 recv,前 88 个字节会是其余的数据吗?

是的。

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

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

【讨论】:

哇,这一定是我在这个网站上得到的最快、最直接的回应。感谢您的澄清。你摇滚,这个网站摇滚! :P TBH,那是因为问题很清楚,易于理解,所以@James 能够给出简洁准确的答复。如果所有的问题都那么清楚就好了:( 稍微详细地说,每次调用recv 可以接收从1 到请求的缓冲区大小的任何内容。无论发送的“块”如何,都可能发生这种情况,并且可能由慢速链接、数据包碎片、服务器编写错误等任何原因引起。

以上是关于当调用winsock 中的recv 函数并且没有收到所有数据时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的 Winsock recv() 减速

在winsock2中使用选择

Winsock recv() 返回不正确的数据

WinSock WSAEventSelect 模型

winsock套接字的recv函数

Winsock recv() 函数阻塞其他线程