ソケットプログラミングを練習するためにpingクローンを作成しています。ICMPパケットを送信することはできますが、何を渡すかに関係なく、宛先アドレスは0.0.0.0sendto
です。これが最も適切なコードの断片です:
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));
完全なプログラムはGitHubにあります。Mac OS X 10.6.8でコンパイルしており、Wireshark1.8.4を使用してパケットを検証しています。
dest.sin_addr.s_addr
の呼び出しでの値を確認しましたがprintf("%X")
、inet_aton
期待どおりに機能しています。意図的に0x08080808
(Googleのネームサーバー)に設定しましたが、それでも機能しません。
ここで何が間違っているのでしょうか?