sendto:无论传递地址,目标都变为0.0.0.0

时间:2012-12-10 08:49:50

标签: macos sockets

我正在编写一个ping克隆来练习套接字编程。我能够发送ICMP数据包,但无论我传递给sendto的是什么,目标地址都是0.0.0.0。以下是最相关的代码片段:

struct sockaddr_in dest;
memset(&dest, 0, sizeof(dest));
dest.sin_family = AF_INET;
if (0 == inet_aton(argv[1], &dest.sin_addr)) {
  puts("could not parse address\n");
  exit(EXIT_FAILURE);
}

ssize_t nbytes = sendto(sock, &hdr, ICMP_MINLEN, /*flags=*/0,
    (struct sockaddr*)&dest, sizeof(dest));

完整的计划是on GitHub。我正在为Mac OS X 10.6.8编译,我正在使用Wireshark 1.8.4来验证数据包。

我通过调用dest.sin_addr.s_addr验证了printf("%X")的价值,inet_aton正在按预期工作。我甚至故意将其设置为0x08080808(Google的名称服务器),但仍然无效。

我可能在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

github上的完整程序中有一个(复制粘贴)错误:

struct sockaddr_in src;
memset(&dest, 0, sizeof(dest));

声明src后,再次设置dest。这意味着dest的sin_addr成员现在为0,因此您要求的目标地址为0.0.0.0。

顺便说一句,src的sin_port未被初始化,因此如果最终请求已经在使用的本地端口,有时可能会出现其他错误。