0

次のように記述してエンドポイントを接続できます。

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 アドレスにバインドされているリスナーに接続しようとしていたため、これにフラグを立てています。

4

1 に答える 1

1

次のコードを使用すると、問題なく接続されるので、IP アドレスで試してみてください。うまくいかない場合は、ファイアウォールの設定を確認してください。

  var endpoint = new IPEndPoint(new IPAddress(new byte[] {10, 101, 10, 86}), 8000);
  var socket = new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
  socket.Bind(new IPEndPoint(new IPAddress(new byte[]{10,101,10,86}), 8001));
  socket.Connect(endpoint);
于 2012-09-04T10:14:11.957 に答える