man recv()在我的系统上打字,我得到:
ssize_t
recv(int socket, void *buffer, size_t length, int flags);
…
RETURN VALUES
These calls return the number of bytes received, or -1 if an error occurred.
Run Code Online (Sandbox Code Playgroud)
请注意,它length是无符号类型size_t,函数的结果是有符号的ssize_t.
如果传递的值大于SSIZE_MAXfor length,那么理论情况如何recv()填充指向的内存buffer并返回除-1?之外的负值?是否有类型的套接字允许很长的消息(Unix域?)?怎么样MSG_WAITALL?
以下是关于ssize_t(从B.2.12数据类型中提取)的Posix 2008基本原理所说的内容:
ssize_t
这是一个有符号的size_t模拟.措辞是这样的,实现可以选择使用更长的类型,或者只是使用size_t基础类型的签名版本.返回ssize_t(read()和write())的所有函数都描述为"实现定义"输入超过{SSIZE_MAX}的结果.
实际上,这并不完全正确,因为返回的套接字函数ssize_t,包括recv,没有提到有关输入超出的任何内容SSIZE_MAX.因此,我将其视为意图陈述,暗示缺少的措辞recv是错误,可能会在某一天得到纠正.
简而言之,如果要编写可移植代码,则需要确保I/O段不超过SSIZE_MAX.此外,SSIZE_MAX可能小到32767.因此,可移植代码不应该假设它可能更大.
然而,并非所有人都非常关心可移植性.您可能对您的代码运行的实现有所了解.Posix继续说:
已经认识到,一些实现可能具有小于size_t的int.符合要求的应用程序将被限制为不以大于{SSIZE_MAX}的大小执行I/O,但是如果实现提供了扩展范围,则使用扩展的符合要求的应用程序将能够使用整个范围,同时仍然具有单一类型兼容接口.
Posix确保返回的唯一值recv是-1,0或接收的字节数.根据上述措辞,符合的实现可以将大于SSIZE_MAX但小于或等于的值映射2*SSIZE_MAX到除了以外的负整数上-1.(如何实现这一目标留给感兴趣的读者:)).据我所知,Linux并没有记录任何此类扩展.
| 归档时间: |
|
| 查看次数: |
331 次 |
| 最近记录: |