我正在编写一个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的名称服务器),但仍然无效。
我可能在这里做错了什么?
答案 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
未被初始化,因此如果最终请求已经在使用的本地端口,有时可能会出现其他错误。