6

trceroute スクリプトを作成する必要がありますが、その試みが正しいかどうかわかりません。

現在、私はそのようにしています(間違っているか不器用な場合は修正してください):

  1. ip- および udpheader の構造体を取得しました
  2. チェックサム機能
  3. 2 つのソケットを開く: 1 つは SOCK_RAW モードで UDP パケットを送信するため (ttl を操作するため)、もう 1 つはルーターから ICMP 応答を受信するためです。
  4. sendto() を使用して UDP パケットを送信する
  5. ICMP 回答を受信して​​処理する方法がわからない

すべてのヘッダーを自分で定義する必要がある sock_raw を使用するよりも、TTL を変更するより快適な方法はありますか? ICMP sock を開くとき、socket() にはどのパラメータを使用すればよいですか? ICMP 回答を受け取る方法は?

4

3 に答える 3

2

TTLの設定に関しては、を使用できますsetsockopt()pingLinuxでのiputilsのソースからの抜粋は次のとおりです。

if (setsockopt(icmp_sock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, 1) == -1) {
    perror ("ping: can't set multicast time-to-live");
    exit(2);
}

if (setsockopt(icmp_sock, IPPROTO_IP, IP_TTL, &ittl, sizeof(ittl)) == -1) {
    perror ("ping: can't set unicast time-to-live");
    exit(2);
}
于 2011-02-03T14:03:07.670 に答える
2

どのプラットフォームをターゲットにしていますか? OpenBSD ソースからの BSD フレーバーは次のとおりです。

if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0)
    err(5, "icmp socket");
if ((sndsock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
    err(5, "raw socket");

Linux では、IP_RECVERRrecvmsg(2)を一緒に使用する必要があると思います。MSG_ERRQUEUEを参照してくださいip(7)

于 2011-02-03T13:47:52.913 に答える