0

ソケットプログラミングを練習するために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のネームサーバー)に設定しましたが、それでも機能しません。

ここで何が間違っているのでしょうか?

4

1 に答える 1

1

githubの完全なプログラムには1つの(コピーアンドペースト)バグがあります:

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

宣言した後src、あなたは再びmemsetdestします。これは、destのsin_addrメンバーが0になったことを意味するため、0.0.0.0の宛先アドレスを要求しています。

余談ですが、srcsin_portは初期化されていないため、すでに使用されているローカルポートを要求することになった場合、他のエラーが発生することがあります。

于 2012-12-10T09:21:44.870 に答える