Mono Socket.Bind在连接之前使用特定的接口

时间:2016-02-09 05:27:53

标签: c# linux sockets ubuntu mono

我尝试使用特定的本地接口连接到远程服务器。我的日志告诉我一切正常,但是使用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是指定为

的IPEndPoint
IPEndPoint[] 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

1 个答案:

答案 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特定的方式回答这个问题,而且我实际上并没有找到任何其他似乎更好的方法。