我正在尝试为具有 2 个网络适配器(私有和公共)的计算机编写一个程序,该程序将私有到公共接收到的数据回显,反之亦然。我只需要它监听两个特定端口,更具体地说,它应该在 Private 上打开一个套接字服务器,在 Public 上打开一个套接字客户端。
计算机在公共上的 IP 地址是 192.168.1.21,其在私有上的 IP 地址是 172.16.13.1,所以我认为这样的事情会起作用:
IPEndPoint privateEndpoint1 = new IPEndPoint(IPAddress.Parse("172.16.13.1"), port1);
IPEndPoint privateEndpoint2 = new IPEndPoint(IPAddress.Parse("172.16.13.1"), port2);
IPEndPoint publicEndpoint1 = new IPEndPoint(IPAddress.Parse("192.168.1.21"), port1);
IPEndPoint publicEndpoint2 = new IPEndPoint(IPAddress.Parse("192.168.1.21"), port2);
TcpListener priList1 = new TcpListener(privateEndpoint1);
TcpListener priList2 = new TcpListener(privateEndpoint2);
TcpClient pubCli1 = new TcpClient(publicEndpoint1); //Error here
TcpClient pubCli2 = new TcpClient(publicEndpoint2);
然后我得到流并进行实际的回显。
问题是我在标记的行上收到错误:
每个套接字地址(协议/网络地址/端口)通常只允许使用一次
从错误看来,IPEndPoint
构造函数没有区分两个 IP 地址和两个网络适配器。我已经研究过使用普通Socket
的 s 而不是TcpClient
s,但这似乎并没有改变任何东西。