トップ回答者
VB6 複数NICあるうちから任意のNICからの送信方法

質問
-
VB6の質問です。
1つのPCに複数のNICがあり、それぞれのNICは違うレイアのアドレスを持っているとします。
それぞれに対応するホストがあるとします。
それらは、LANでつながっています。
以下のような感じです。
NIC_A(192.168.81.100)
NIC_B(192,168.80.100)
HOST_A(192.168.81.1)
HOST_B(192.168.80.1)
winsockを使うと、任意のアドレスから出力できるらしいのですが、
実現方法がわかりません。
下記のソースを実行すると、エラー40020「現在の状態では不正な処理です」と表示され、connectができません。
Private Sub Form_Load()
Winsock1.LocalPort = 0
Winsock1.Bind 21, "192.168.81,100"
Winsock1.Connect "192.168.81.1", 21 <-ここでエラーとなる
End Sub
任意のNICからの送信方法をご教授ください。
よろしくお願いします。
回答
-
回答ではありません。
りん太 さん の発言:BindはListenするため、つまり、待ち受けポートとして設定するためのものであり、どのNICを使うかを指定するためのものではありません。下記のソースを実行すると、エラー40020「現在の状態では不正な処理です」と表示され、connectができません。
Private Sub Form_Load()
Winsock1.LocalPort = 0
Winsock1.Bind 21, "192.168.81,100"
Winsock1.Connect "192.168.81.1", 21 <-ここでエラーとなる
End Sub
サーバーのように待ち受け状態に入ろうとしている状態で、他のPCにConnect(接続)しようとしているので、エラーになっているのでは?
複数のNICを使い分けるにはルーティングテーブルとかそういったレベルの話になるのかなぁ?
(Raw Socketでできるのかどうかは知らない)
参考になった返信には「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に指定できます)。- 回答としてマーク sk7474 2009年3月11日 7:40
-
りん太さんからの返信がないので、jzkeyさんの回答の補足をしたいと思います。
> 1つのPCに複数のNICがあり、それぞれのNICは違うレイアのアドレスを持っているとします。
> それぞれに対応するホストがあるとします。
一つのPCにNICを複数差した時点で、それはルーターと同じ扱いとなり、そのためにルーティングテーブルを設定が必要となります。
そのためどのNICを使用するか、というのはプログラムで考慮する必要はなく、設定されているルーティングテーブルに従って(ルーティングテーブルが正しければ)適切なNICが使用されます。
今回の場合、ルーティングテーブルが正しく設定されていないために通信できていないものと思われます。
(デフォルトゲートウェイを設定する場合、NICが複数差さっているため、というような警告が表示されませんでしたか?)
なお、ルーティングテーブルを表示/設定するためのコマンドとしてROUTEというコマンドがあります。
コマンドプロンプトで「ROUTE /?」もしくは「ROUTE」だけ入力するとヘルプメッセージが表示されますので、細かい使用方法についてはそれを、もしくはルーティングに関して説明しているサイトを参考にしてください。
簡単に説明しますと、現在設定されているルーティングテーブルを表示するには、「ROUTE PRINT」、ルーティングテーブルを追加するには「ROUTE ADD」を使います。
ROUTE PRINTした結果を貼り付ければ、どのような設定をすれば良いか回答があると思います。
# といいつつ、自分はルーター専用機でのルーティングはともかくPCでのルーティングテーブルの設定って苦手なんだよなぁ。- 回答としてマーク sk7474 2009年3月11日 7:39
-
当てずっぽうで、Winsock1.LocalPort = 0を消したらどうなりますか? この行もBind相当のことを行うので、2回できなくてエラーになっているのかも。
socketプログラミングとしてconnect()前にbind()するのは構いません。ただしWinsockやMSWINSCK.OCXがそれをサポートしているか、まではわかりません。
試しにVB6はインストールしてみましたがさすがにmulti home環境まで構築する気にはなれませんでした。
それとは別に、毎回エラーになるのでしょうか? エラーの内容は同じなのでしょうか。
前回のセッションが残っていて、それが原因でサーバ側もしくはクライアント側が混乱している可能性もあります。
Bindの引数を毎回異なるポート番号を使用すればこれに関しては回避できると思いますが。
(毎回ポート番号を変化させる行為がWinsock1.LocalPort = 0です。)
既におわかりかと思いますが、直接NICを指定しての操作はできず、NICに割り振られているIPアドレスを指定して、となります。
ですが、ルーティングテーブルというものがあり、HOST_A(192.168.81.1)に接続しようとしたときには自動的にNIC_A(192.168.81.100)が使われます。その逆も。
これがNIC_Bを使ってHOST_Aへの接続といった変則的なの場合にコーディングされているようなlocal address指定が必要になります。
- 回答としてマーク sk7474 2009年3月11日 7:39
すべての返信
-
回答ではありません。
りん太 さん の発言:BindはListenするため、つまり、待ち受けポートとして設定するためのものであり、どのNICを使うかを指定するためのものではありません。下記のソースを実行すると、エラー40020「現在の状態では不正な処理です」と表示され、connectができません。
Private Sub Form_Load()
Winsock1.LocalPort = 0
Winsock1.Bind 21, "192.168.81,100"
Winsock1.Connect "192.168.81.1", 21 <-ここでエラーとなる
End Sub
サーバーのように待ち受け状態に入ろうとしている状態で、他のPCにConnect(接続)しようとしているので、エラーになっているのでは?
複数のNICを使い分けるにはルーティングテーブルとかそういったレベルの話になるのかなぁ?
(Raw Socketでできるのかどうかは知らない)
参考になった返信には「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に指定できます)。- 回答としてマーク sk7474 2009年3月11日 7:40
-
-
りん太さんからの返信がないので、jzkeyさんの回答の補足をしたいと思います。
> 1つのPCに複数のNICがあり、それぞれのNICは違うレイアのアドレスを持っているとします。
> それぞれに対応するホストがあるとします。
一つのPCにNICを複数差した時点で、それはルーターと同じ扱いとなり、そのためにルーティングテーブルを設定が必要となります。
そのためどのNICを使用するか、というのはプログラムで考慮する必要はなく、設定されているルーティングテーブルに従って(ルーティングテーブルが正しければ)適切なNICが使用されます。
今回の場合、ルーティングテーブルが正しく設定されていないために通信できていないものと思われます。
(デフォルトゲートウェイを設定する場合、NICが複数差さっているため、というような警告が表示されませんでしたか?)
なお、ルーティングテーブルを表示/設定するためのコマンドとしてROUTEというコマンドがあります。
コマンドプロンプトで「ROUTE /?」もしくは「ROUTE」だけ入力するとヘルプメッセージが表示されますので、細かい使用方法についてはそれを、もしくはルーティングに関して説明しているサイトを参考にしてください。
簡単に説明しますと、現在設定されているルーティングテーブルを表示するには、「ROUTE PRINT」、ルーティングテーブルを追加するには「ROUTE ADD」を使います。
ROUTE PRINTした結果を貼り付ければ、どのような設定をすれば良いか回答があると思います。
# といいつつ、自分はルーター専用機でのルーティングはともかくPCでのルーティングテーブルの設定って苦手なんだよなぁ。- 回答としてマーク sk7474 2009年3月11日 7:39
-
当てずっぽうで、Winsock1.LocalPort = 0を消したらどうなりますか? この行もBind相当のことを行うので、2回できなくてエラーになっているのかも。
socketプログラミングとしてconnect()前にbind()するのは構いません。ただしWinsockやMSWINSCK.OCXがそれをサポートしているか、まではわかりません。
試しにVB6はインストールしてみましたがさすがにmulti home環境まで構築する気にはなれませんでした。
それとは別に、毎回エラーになるのでしょうか? エラーの内容は同じなのでしょうか。
前回のセッションが残っていて、それが原因でサーバ側もしくはクライアント側が混乱している可能性もあります。
Bindの引数を毎回異なるポート番号を使用すればこれに関しては回避できると思いますが。
(毎回ポート番号を変化させる行為がWinsock1.LocalPort = 0です。)
既におわかりかと思いますが、直接NICを指定しての操作はできず、NICに割り振られているIPアドレスを指定して、となります。
ですが、ルーティングテーブルというものがあり、HOST_A(192.168.81.1)に接続しようとしたときには自動的にNIC_A(192.168.81.100)が使われます。その逆も。
これがNIC_Bを使ってHOST_Aへの接続といった変則的なの場合にコーディングされているようなlocal address指定が必要になります。
- 回答としてマーク sk7474 2009年3月11日 7:39