【发布时间】: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