c# - Mono Socket.Bind 在连接之前绑定(bind)以使用特定接口(interface)

标签 c# linux sockets ubuntu mono

我正在尝试使用特定的本地接口(interface)连接到远程服务器。我的日志告诉我一切都按预期工作,但使用 netstat 检查时,每个连接都使用默认接口(interface)。

我正在使用以下代码将 TcpClient 绑定(bind)到特定的本地端点

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

显然这里出了点问题。端口和接口(interface)都不匹配。 Netstat 作为 sudo 运行,所以我不能认为它是错误的。我还尝试手动创建一个套接字,调用它的绑定(bind)方法,并将 TcpClient 的 Client 属性设置为手动绑定(bind)的套接字,但我得到了相同的结果。

我这里有什么地方做错了吗?有没有不同的方法来强制套接字在单声道上使用特定的本地端点?

我以非 root 用户身份运行此应用程序,mono --version 是 Mono JIT 编译器版本 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

最佳答案

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

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

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

关于c# - Mono Socket.Bind 在连接之前绑定(bind)以使用特定接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35284552/

相关文章:

c# - 显示视频帧和 RenderTargetBitmap 位置

c# - Microsoft Office 文档显示 Sharepoint URL 而不是本地

objective-c - TCP套接字通信问题

java - 对网站的 get 请求返回错误

Linux IO 操作符 '>'

java - 如何在 UDP 协议(protocol)上同步通信?

c# - pinvoke - 传递一个字符串 [] 作为输出参数

c# - 在加载事件或构造函数中初始化属性?

linux - unix sed 命令匹配一个词

linux - 用于在特定文件夹中查找文件并基于文件的 "age"的 Shell 脚本