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是无线电控制。使用这两个,我只显示具有指定地址系列的地址。

  • 用户选择本地 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);

它抛出一个带有代码的 SocketException:10049 (AddressNotAvailable)。

  • 如果我不绑定套接字,则Connect可以。
  • 如果我指定IPAddress.Any本地端点并绑定,则Connect可以。
  • 如果我为本地端点指定本地 IP 并绑定,Connect则不起作用。

我究竟做错了什么?

编辑:已解决。我之所以标记它,是因为我试图连接同一台机器上的侦听器,并且(结果)绑定到相同的 IP 地址。

4

1 回答 1

1

如果我使用以下代码,它可以毫无问题地连接,因此请使用您的 IPAddresses 尝试一下,如果这不起作用,则可能检查您的防火墙设置。

  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 回答