gpt4 book ai didi

c - recv() 的原型(prototype)

转载 作者:太空狗 更新时间:2023-10-29 17:22:58 25 4
gpt4 key购买 nike

在我的系统上输入 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.

请注意,length 是无符号类型 size_t,函数的结果是有符号的 ssize_t

如果为 length 传递了一个大于 SSIZE_MAX 的值,那么 recv() 将填充 指向的内存的情况在理论上有多大? code>buffer 并返回 -1 以外的负值?是否有允许很长消息(Unix 域?)的套接字类型? MSG_WAITALL 怎么样?

最佳答案

以下是 Posix 2008 基本原理对 ssize_t 的说明(摘自 B.2.12 Data Types ):

ssize_t
This is intended to be a signed analog of size_t. The wording is such that an implementation may either choose to use a longer type or simply to use the signed version of the type that underlies size_t. All functions that return ssize_t (read() and write()) describe as "implementation-defined" the result of an input exceeding {SSIZE_MAX}.

实际上,这并不完全正确,因为返回 ssize_t 的套接字函数,包括 recv,没有提及任何关于输入超过 SSIZE_MAX。所以我将其视为意向声明,暗示 recv 中缺失的措辞是一个错误,可能有一天会得到纠正。

简而言之,如果你想编写可移植的代码,你需要确保你的 I/O 段不超过 SSIZE_MAX。此外,SSIZE_MAX 可能小到 32767。因此可移植代码不应假设它可能更大。

然而,并不是每个人都那么关心便携性。您可能对代码运行的实现有所了解。 Posix 继续:

It is recognized that some implementations might have ints that are smaller than size_t. A conforming application would be constrained not to perform I/O in pieces larger than {SSIZE_MAX}, but a conforming application using extensions would be able to use the full range if the implementation provided an extended range, while still having a single type-compatible interface.

Posix 确实保证 recv 返回的唯一值是 -1、0 或接收到的字节数。根据上述措辞,符合规范的实现可以将大于 SSIZE_MAX 但小于或等于 2*SSIZE_MAX 的值映射到 -1 以外的负整数上。 (如何实现这一点留给感兴趣的读者作为练习 :))。不过,据我所知,Linux 没有记录任何此类扩展。

关于c - recv() 的原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17221856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com