【发布时间】:2015-09-25 20:20:10
【问题描述】:
我目前正在编写一个供个人使用的小型 UDP 套接字库,但我一直无法找到任何相关文档。
我指的函数是 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);,来自 POSIX <sys/socket.h> 标头。
无论recvfrom 是成功还是失败,我都想重用我传递给recvfrom 的src_addr 结构以与sendto(相同的标头)一起使用。成功后,它将包含发送数据的对等方的地址(我的用例中只有一个),这是预期的行为;但是,当非阻塞读取失败时,它会生成错误EAGAIN,然后src_addr 的状态就不清楚了。如果src_addr 没有被修改,它仍然会包含目标地址并且可以重复使用,但如果是,那么我将不得不使用临时变量。
【问题讨论】:
-
“
src_addr的状态未定义” - 你在哪里看到的? -
@immibis:我没有;这就是为什么我说它是未定义的——据我所知,它在任何地方都没有记录。这不是编程上下文中“未定义”的典型用法(隐式而不是显式),但含义是相同的。尽管如此,我已经更新了问题。
-
你想多了。只需使用 temp 变量。将其称为“稳健性”、“可移植性”或“向前兼容性”并继续前进。
-
POSIX 表示如果地址由协议指定,则写入源地址,否则其值未指定。就目前而言,并没有严格禁止覆盖源地址(例如,用零),但这是额外的工作,它不会特别有用,所以我怀疑任何实现都会这样做。当然,现在您也可以将措辞解释为“UDP 确实(通常)提供消息地址”,因此地址字段被写入。