マシン(ラップトップ/ 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アドレスが上書きされますか?
この質問に対する答えは、私がシミュレーションしようとしているネットワーククライアントごとに個別の論理インターフェイスを作成する必要があるかどうか、あるいは完全に廃止できるかどうかを決定するのに役立ちます。
ランダムなMACアドレスに対してdhclientがDHCP経由でランダムなIPを取得しているので、インターフェイスへのマッピングがこの場合にどのように機能するのでしょうか?あなたはこの特定の事件にもっと具体的になりますか? Wgetはバインドアドレスを指定することしかできません。現在のシナリオでは、これがエラーにつながるため、IPアドレスに基づいてインターフェイスを特定しようとしますか? – Pocha
私はあなたを正しく理解していれば、IPアドレスがDHCPによって得られているので、どのようにIPアドレスを知っているでしょうか? – Prabhu
いいえdhclientとwgetを2つの独立したバイナリとみなします。私のシェルスクリプトで使用しています。私はdhtestを起動してdhcpをネゴシエートし、私はdhtestを変更してIPアドレスをダンプしてスクリプトに入れます。今度は、そのIPアドレスとしてbind-addressを使ってwgetを起動します。 – Pocha