人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: mai_mai_mail
●カテゴリ:コンピュータ インターネット
✍キーワード:IP IPアドレス LAN VC Win32
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● makeworld
●60ポイント

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();
◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ