我可以通过写:
来连接端点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
是广播控制。使用这两个,我只显示具有指定地址族的地址。
我得到了终点:
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
可以正常工作。Connect
不起作用。我做错了什么?
编辑已解决。我正在标记这个,因为我试图连接一个在同一台机器上的监听器,并且(结果)绑定到同一个IP地址。
答案 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);