gpt4 book ai didi

c - struct sockaddr.sa_data 似乎太小

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:50 24 4
gpt4 key购买 nike

我在 Mac OS X 中做了一些干预(本质上是拦截 C 调用),我注意到 ping 应用程序试图调用 addrlen 值为 16 的 sendto 函数。在 sys/socket.h 中我可以清楚地看到sa_data 数组最多只能容纳 14 个字节:

/*
* [XSI] Structure used by kernel to store most addresses.
*/
struct sockaddr {
__uint8_t sa_len; /* total length */
sa_family_t sa_family; /* [XSI] address family */
char sa_data[14]; /* [XSI] addr value (actually larger) */
};

评论说“实际上更大”让我很吃惊,但我对此无能为力。

无论如何,手册页显示 sendto 函数的签名如下所示:

ssize_t
sendto(int socket,
const void *buffer,
size_t length,
int flags,
const struct sockaddr *dest_addr,
socklen_t dest_len);

然后,如果长度值太长而无法以原子方式传递消息,手册页会特别指出该怎么做。它忽略了 dest_len 大于 dest_addr.sa_data 可以容纳的情况。

如果我尝试将 16 字节的数据从调用方复制到另一个 dest_addr.sa_data 中,它会失败并且应用程序崩溃,这是应该的。我误解了这个字段的使用方式吗?为什么标题中的注释说“实际上更大”但随后为数组分配了固定大小?

最佳答案

您实际上永远不应该使用struct sockaddr。它就像 void * 中的 void,是实际 sockaddr_foo 结构的替代品。

关于c - struct sockaddr.sa_data 似乎太小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22950130/

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