我可以通过以下方式连接端点:
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 地址。