2016-02-09 3 views
1

Я пытаюсь подключиться к удаленному серверу с использованием определенного локального интерфейса. Мои журналы говорят мне, что все работает по назначению, но при проверке с помощью netstat каждое соединение использует интерфейс по умолчанию.Mono Socket. Перед подключением к конкретному интерфейсу

Я использую следующий код для привязки 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, поэтому я не могу предположить, что это неправильно. Я также попытался вручную создать сокет, вызвать его метод привязки и установить свойство TcpClient Client связанного вручную сокета, но я получаю тот же результат.

Есть ли что-то, что я делаю неправильно здесь? Есть ли другой способ заставить Socket использовать определенный локальный конечный пункт в моно?

Я бег этого приложения, как не суперпользователь, моно --version является Mono JIT compiler version 3.2.8 (Debian 3.2.8+dfsg-4ubuntu1.1), убунт версия сервера является Ubuntu 14.04.3 LTS

Edit 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 

ответ

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-специфическим способом, и я действительно не нашел других, которые казались бы лучше.

+0

Ну, это не то, что я надеялся услышать. К счастью, похоже, что на удаленном сервере имеется несколько IP-адресов, поэтому я могу просто использовать таблицу маршрутизации. Я буду ждать один-два дня (надеюсь), однако, ответы. – logisticalerror

Смежные вопросы