次のように記述してエンドポイントを接続できます。
socket.Connect(endPoint);
しかし、私が接続するデバイスの中には、特定の IP アドレスからの接続しか受け付けないものがあります。
サーバーで使用するには、ユーザーがローカルエンドポイントを選択できるようにしたいと思います。
次のように入力されたコンボボックスをユーザーに提供します。
var source = Dns.GetHostAddresses(Dns.GetHostName())
.Where(ip => ip.AddressFamily == (rbIPv4.Checked
? AddressFamily.InterNetwork
: AddressFamily.InterNetworkV6)).ToArray();
cbLocalIP.DataSource = source;
rbIPv4
そしてrbIPv6
ラジコンです。この 2 つを使用して、指定したアドレス ファミリのアドレスのみを表示します。
- ユーザーはローカル IP アドレスを選択し、ローカル ポート番号を入力します。
- 次に、リモート IP アドレスとリモート ポート番号を入力します。
エンドポイントを取得します:
var localEP = new IPEndPoint((IPAddress)cbLocalIP.SelectedItem, localPort);
var remoteEP = new IPEndPoint(remoteIP, remotePort);
ソケットを作成します。
var socket = new Socket(remoteEP.AddressFamily,
SocketType.Stream,
ProtocolType.Tcp);
これをローカル エンドポイントにバインドします。
socket.Bind(localEP);
リモートエンドポイントに接続しようとしています:
socket.Connect(remoteEP);
コード 10049 (AddressNotAvailable) で SocketException をスローします。
- ソケットをバインドしなければ、問題なく
Connect
動作します。 IPAddress.Any
ローカル エンドポイントとバインドを指定すると、正常に動作しますConnect
。- ローカル エンドポイントにローカル IP を指定してバインドすると、
Connect
機能しません。
私は何を間違っていますか?
編集:解決しました。同じマシンにあり、(結果として) 同じ IP アドレスにバインドされているリスナーに接続しようとしていたため、これにフラグを立てています。