【问题标题】:Mono Socket.Bind before connecting to use a specific interfaceMono Socket.Bind 在连接之前使用特定接口
【发布时间】:2016-02-09 05:27:52
【问题描述】:

我正在尝试使用特定的本地接口连接到远程服务器。我的日志告诉我一切都按预期工作,但是通过 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 运行,所以我不能假设它是错误的。我也尝试手动创建一个socket,调用它的bind方法,并将TcpClient的Client属性设置为手动绑定的socket,但是我得到了同样的结果。

我在这里做错了吗?是否有其他方法可以强制 Socket 在单声道上使用特定的本地端点?

我以非root用户运行这个应用,mono--version是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

【问题讨论】:

    标签: c# linux sockets ubuntu mono


    【解决方案1】:

    底线:你不能这样做,不是在套接字级别。

    出站流量的路由由网络路由配置决定。您必须为您的目的地创建一个明确的路由表条目,以强制使用特定的适配器。

    您可以绑定到特定的 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 的方式回答这个问题,而且我实际上没有找到任何其他看起来更好的方法。

    【讨论】:

    • 这不是我希望听到的。幸运的是,远程服务器似乎有多个 IP,所以我可能只使用路由表。不过,我会等一两天(希望)有更多回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多