绑定本地IP后的Socket.Connect抛出10049

时间:2012-09-04 08:35:32

标签: c# winforms sockets ip-address

我可以通过写:

来连接端点
socket.Connect(endPoint);

但我连接的某些设备只接受来自特定IP地址的连接 因此,要在服务器中使用,我想让用户能够选择本地端点:

我给用户一个这样填充的组合框:

var source = Dns.GetHostAddresses(Dns.GetHostName())
    .Where(ip => ip.AddressFamily == (rbIPv4.Checked
        ? AddressFamily.InterNetwork
        : AddressFamily.InterNetworkV6)).ToArray();
cbLocalIP.DataSource = source;

rbIPv4rbIPv6是广播控制。使用这两个,我只显示具有指定地址族的地址。

  • 用户选择本地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地址。

1 个答案:

答案 0 :(得分: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);