2016-10-20 10 views
0

マシン(ラップトップ/ PC)で実行されるネットワーククライアント(好ましくはCコード)をシミュレートしようとしています。開始時に、マシンが属しているネットワークのルータからDHCPを介して新しいIPアドレスをネゴシエートします。 IPアドレスを取得した後、構成ファイルごとにhttp要求(ダウンロード/アップロード)を行うことが考えられます。Wgetのバインドアドレスが、パケットのルーティング元のインターフェイスのIPアドレスをオーバーライドします。

設定は主に、ルータのストレステストの目的で複数のクライアントを起動することです。

DHCPネゴシエーションの部分を行うに出くわしました。ランダムなMACアドレスを作成します。&は、ルータから同じIPアドレスを取得します。

次の手順では、クライアントをhttp呼び出しを行うように拡張します。私はhttps://github.com/jay/wget &にフラグ--bind-addressを探し始め

--bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local host.\n"), 

私の注意を引いた私が理解することである - このフラグの目的は、マシン上の適切なインターフェイスを選択することです。近いソースにご覧の上、私はまさにネットワーク/ソケットの専門家ではないです以下のスニペットは機能sockaddr_set_data (sa, &ip, 0);

static void 
sockaddr_set_data (struct sockaddr *sa, const ip_address *ip, int port) 
{ 
    switch (ip->family) 
    { 
    case AF_INET: 
     { 
     struct sockaddr_in *sin = (struct sockaddr_in *)sa; 
     xzero (*sin); 
     sin->sin_family = AF_INET; 
     sin->sin_port = htons (port); 
     sin->sin_addr = ip->data.d4; 
     break; 
     } 
#ifdef ENABLE_IPV6 
    case AF_INET6: 
     { 
     struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; 
     xzero (*sin6); 
     sin6->sin6_family = AF_INET6; 
     sin6->sin6_port = htons (port); 
     sin6->sin6_addr = ip->data.d6; 
#ifdef HAVE_SOCKADDR_IN6_SCOPE_ID 
     sin6->sin6_scope_id = ip->ipv6_scope; 
#endif 
     break; 
     } 
#endif /* ENABLE_IPV6 */ 
    default: 
     abort(); 
    } 
} 

以下のように見えるフラグ

static bool 
resolve_bind_address (struct sockaddr *sa) 
{ 
    struct address_list *al; 

    /* Make sure this is called only once. opt.bind_address doesn't 
    change during a Wget run. */ 
    static bool called, should_bind; 
    static ip_address ip; 
    if (called) 
    { 
     if (should_bind) 
     sockaddr_set_data (sa, &ip, 0); 
     return should_bind; 
    } 
    called = true; 

    al = lookup_host (opt.bind_address, LH_BIND | LH_SILENT); 
    if (!al) 
    { 
     /* #### We should be able to print the error message here. */ 
     logprintf (LOG_NOTQUIET, 
       _("%s: unable to resolve bind address %s; disabling bind.\n"), 
       exec_name, quote (opt.bind_address)); 
     should_bind = false; 
     return false; 
    } 

    /* Pick the first address in the list and use it as bind address. 
    Perhaps we should try multiple addresses in succession, but I 
    don't think that's necessary in practice. */ 
    ip = *address_list_address_at (al, 0); 
    address_list_release (al); 

    sockaddr_set_data (sa, &ip, 0); 
    should_bind = true; 
    return true; 
} 

ためで蹴らますました。私が確認したいのは、Wgetが送信しているパケットにIPアドレスを明示的に追加すると、OSが特定のインターフェイスを離れるときにOSがこれらのパケットに対して設定するIPアドレスが上書きされますか?

この質問に対する答えは、私がシミュレーションしようとしているネットワーククライアントごとに個別の論理インターフェイスを作成する必要があるかどうか、あるいは完全に廃止できるかどうかを決定するのに役立ちます。

答えて

0

パケットは、ソケットがバインドされているインターフェイス経由でルーティングされます。 IPアドレスは仮想またはイーサネットインターフェイスのプライマリIPにすることができます。そして、IPは、通信に使用される物理インタフェースを決定する。

特定の物理インターフェイスに複数の仮想IPアドレスを作成し、それぞれが異なるIPにバインドするクライアントを作成できます。これはルータ(シミュレーション)のさまざまなソースのケースを示しますが、すべて同じ物理インターフェイスを使用します。

+0

ランダムなMACアドレスに対してdhclientがDHCP経由でランダムなIPを取得しているので、インターフェイスへのマッピングがこの場合にどのように機能するのでしょうか?あなたはこの特定の事件にもっと具体的になりますか? Wgetはバインドアドレスを指定することしかできません。現在のシナリオでは、これがエラーにつながるため、IPアドレスに基づいてインターフェイスを特定しようとしますか? – Pocha

+0

私はあなたを正しく理解していれば、IPアドレスがDHCPによって得られているので、どのようにIPアドレスを知っているでしょうか? – Prabhu

+0

いいえdhclientとwgetを2つの独立したバイナリとみなします。私のシェルスクリプトで使用しています。私はdhtestを起動してdhcpをネゴシエートし、私はdhtestを変更してIPアドレスをダンプしてスクリプトに入れます。今度は、そのIPアドレスとしてbind-addressを使ってwgetを起動します。 – Pocha

関連する問題