1

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

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

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

4

1 回答 1

3

我在这里假设 TCP。

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

是的。

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

下次您会收到它们。

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

不。

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

是的。

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

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

于 2012-04-10T23:21:41.297 回答