VS2005 VC WIN32環境で、PCに2つのLANカード、それぞれ別々にインターネットに接続している場合(異なるIPアドレスを持っている)、自作のアプリケーションからLANインターフェース、あるいはIPアドレス(この場合はソースIP)を指定して作ることはできるのでしょうか?FIREWALLアプリがそのようなことをやっているのでできなことはないと思いますが、作り方のサンプルがありましたら教えてください。

回答の条件
  • 1人5回まで
  • 登録:2009/10/17 16:18:39
  • 終了:2009/10/24 16:20:02

回答(1件)

id:makeworld No.1

makeworld回答回数75ベストアンサー獲得回数232009/10/17 22:29:03

ポイント60pt

bind()関数で自分のIPアドレスを指定できます。

クライアント・プログラムの場合は、connect()を実行する前に、sockaddr_in構造体のsin_addrに自分のIPアドレスを指定して、bind()を呼び出せばOKです。(UDPの場合は、sendto()の前にbind()を実行)

サーバ・プログラムの場合も、bind()引数のsockaddr_in構造体のsin_addrに、自分のアドレスを指定すれば待ち受けIPアドレスを限定できます。

	WSADATA wsaData;
	struct sockaddr_in da;
	struct sockaddr_in sa;
	SOCKET s;
	char buff[1024];
	int n;

	WSAStartup(MAKEWORD(2,0), &wsaData);

	s = socket(AF_INET, SOCK_STREAM, 0);
	sa.sin_family = AF_INET;
	sa.sin_port = 0; /* ANY */
//	sa.sin_port = htons(12345); /* source port */
	sa.sin_addr.s_addr = inet_addr("127.0.0.1"); /* source addr */
	bind(s, (struct sockaddr *)&sa, sizeof(sa));

	da.sin_family = AF_INET;
	da.sin_port = htons(80);
	da.sin_addr.s_addr = inet_addr("127.0.0.1");
	connect(s, (struct sockaddr *)&da, sizeof(da));

	strcpy_s(buff, "GET / HTTP/1.0\r\n\r\n");
	send(s, buff, strlen(buff), 0);
	while((n = recv(s, buff, sizeof(buff), 0)) > 0) {
		fwrite(buff, n, 1, stdout);
	}
	closesocket(s);

	WSACleanup();
id:mai_mai_mail

ありがとうございます。解決しました。また、既成のプログラムを特定のアドレス、インターフェースにアサインすることは可能でしょうか?(2つのネットワークインターフェースがあるとき)

2009/10/17 23:33:20
  • id:makeworld
    既成のプログラムでも、OSのルーティングテーブルをいじれば対応できる場合があります。
    ただし、同じPC上のすべてのプログラムに影響があるので、注意が必要です。
    (すべてのプログラムで、ある宛先への通信が片側のLANカードから送信されます)

    例) 10.0.0.123宛ての通信を、192.168.1.1に送信する。
    (192.168.1.1は、自分のアドレスではなく、ルータのアドレスです)

    route add 10.0.0.123 mask 255.255.255.255 192.168.1.1

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません