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



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

send

符合成功完成时返回发送的字节数并在失败时返回 −1 的要求的唯一方法是send永远不会发送超过SSIZE_MAX个字节。当length参数超过SSIZE_MAX时,send必须失败或返回小于请求的长度。

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

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

最新更新