struct sockaddr.sa_data似乎太小了

时间:2014-04-08 23:28:07

标签: c macos sockets networking sendto

我正在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) */
};

这让我感到很震惊,评论说“实际上是更大的”#34;但我无能为力。

无论如何,手册页显示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,则它会失败并且应用程序崩溃,应该如此。我误解了这个领域是如何使用的吗?为什么标题中的评论说"实际上更大"但是然后为数组分配一个固定的大小?

1 个答案:

答案 0 :(得分:1)

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