我尝试使用特定的本地接口连接到远程服务器。我的日志告诉我一切正常,但是使用netstat检查,每个连接都使用默认界面。
我使用以下代码将TcpClient绑定到特定的本地端点
Console.WriteLine("Binding to {0}", connectionArgs.LocalBindingInterface.ToString());
client = new TcpClient(connectionArgs.LocalBindingInterface);
Console.WriteLine("Bound to {0}", client.Client.LocalEndPoint.ToString());
其中connectionArgs.LocalBindingInterface是指定为
的IPEndPointIPEndPoint[] localEndPoints = new IPEndPoint[2];
localEndPoints[0] = new IPEndPoint(IPAddress.Parse("192.168.0.99"), 0);
localEndPoints[1] = new IPEndPoint(IPAddress.Parse("192.168.0.100"), 0);
此处列出的IP地址不是实际地址。
当我查看我的日志时,这是我收到的信息
Binding to 192.168.0.99:0
Bound to 192.168.0.99:59252
Binding to 192.168.0.100:0
Bound to 192.168.0.100:53527
但是当我netstat -n -p --tcp -a
我得到
tcp 0 0 192.168.0.98:39948 remote_addr_here:443 ESTABLISHED 17857/mono
tcp 0 0 192.168.0.98:60009 remote_addr_here:443 ESTABLISHED 17857/mono
显然这里有些不对劲。没有端口,也没有接口匹配。 Netstat以sudo身份运行,所以我不能认为它是错误的。我还试图手动创建一个套接字,调用它的bind方法,并将TcpClient的Client
属性设置为手动绑定的套接字,但我得到了相同的结果。
我在这里做错了吗?是否有不同的方法强制Socket在mono上使用特定的Local EndPoint?
我以非root用户身份运行此应用,单声道版本为Mono JIT compiler version 3.2.8 (Debian 3.2.8+dfsg-4ubuntu1.1)
,服务器的ubuntu版本为Ubuntu 14.04.3 LTS
编辑1:
在调用TcpClient.Connect()
后添加了额外的日志记录调用Binding to 192.168.0.100:59000
Bound to 192.168.0.100:59000
After connect bound to 192.168.0.98:55484
答案 0 :(得分:2)
底线:你不能这样做,而不是在套接字级别。
出站流量的路由由网络路由配置决定。您必须为目标创建显式路由表条目,以强制使用特定的适配器。
您可以绑定到特定的IP地址,但这只会导致入站流量被过滤,即您只会接收发送到该IP地址的流量。
您可能还想阅读相关问题:
How to stop behaviour: C++ Socket sendto changes interface - 上下文是C ++,并不局限于Windows,但它有恕我直言,是关于该主题的最直接,最相关的注释。
Using a specific network interface for a socket in windows - 坦白说,问题和回答都很差。但它确实包含一些你可能会觉得有用的引用和链接。
可以说,这个问题可能已被关闭,作为其中一个,或者甚至是另一个类似问题的副本。但是这两个人并没有以一种准确的,以C#/ .NET特定的方式回答这个问题,而且我实际上并没有找到任何其他似乎更好的方法。