如何在send()中处理缓冲区长度输入和返回值大小不匹配?

时间:2018-02-15 15:29:43

标签: c linux sockets posix

send()*函数如何处理 -
ssize_t retval = send(sock, buf, SIZE_MAX, 0);

如果send成功发送SIZE_MAX字节,则返回类型不足以处理如此大的值(通常为SSIZE_MAX~ = SIZE_MAX / 2)。

在这种情况下,send()函数是否会将自身限制为仅发送SSIZE_MAX字节?

* ssize_t send(int socket, const void *buffer, size_t length, int flags);
- https://linux.die.net/man/3/send

3 个答案:

答案 0 :(得分:1)

send符合要求它返回成功完成时发送的字节数以及如果失败则返回-1的唯一方法是send永远不会发送超过SSIZE_MAX {1}}字节。当length参数超过SSIZE_MAX时,send必须失败或返回的长度小于请求的长度。

答案 1 :(得分:0)

send()的长度受到底层协议处理消息的能力的限制。返回已签名以报告错误收集,因此负数是错误。因此理论上它是有限的,但是还没有传输SIZE_MAX消息的协议。

答案 2 :(得分:-1)

send()将尝试从SIZE_MAX指向的缓冲区发送buf个字节。但是,SIZE_MAX基本上表示架构的指针类型可以想象的最大值。所以它通常至少是整个地址空间的大小,如果不是更多的话。