2011-02-03 15 views
6

私はtrcerouteスクリプトを書く必要がありますが、私の試みが正しいかどうかはわかりません。基本的なtracerouteスクリプトをC言語で書く

今私は(私が間違っていたり、不器用をやっているなら、私を修正してください)そのようにそれをやっている:

  1. は、IP-のための構造体を手に入れたと
  2. チェックサム機能
  3. udpheader 2つのソケットを開く:SOCK_RAWモード(ttlを操作する)でUDPパケットを送信するためのものと、ルータからICMP応答を受信するもの。

を受け取り、ICMP応答を処理する方法を手掛かりを持っていないUDPパケットに

  • を送信するためにはsendto()を使用して、私はすべてを定義する必要がどこSOCK_RAWを使用するよりもTTLを変更するには、任意のより快適な方法があります。自分でヘッダーを作っていますか? ICMPソケットを開くときにsocket()に使用するパラメータは何ですか? ICMP回答を受け取る方法は?

  • 答えて

    2

    どのプラットフォームをターゲットに設定していますか?

    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では、私は信じて、あなたがMSG_ERRQUEUEIP_RECVERRrecvmsg(2)を使用する必要があり、ip(7)を参照してください:ここではOpenBSD sourceからBSD風味です。

    +0

    お返事ありがとうございます。それは私を前向きなものにしてくれました。 –

    2

    TTLの設定に関する限り、setsockopt()を使用できます。 iputilsのソースであるping(Linux版)の抜粋です。

    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); 
    } 
    
    +0

    ありがとうございました。 –

    関連する問題