Система, над которой я сейчас работаю, состоит из ПК с контроллером под управлением XP с .Net 2, подключенного к набору встроенных систем. Все эти компоненты взаимодействуют друг с другом по сети Ethernet. В настоящее время я использую TcpClient.Connect на компьютере XP, чтобы открыть соединение со встроенными системами для отправки сообщений TCP / IP.
Теперь мне нужно подключить компьютер XP к внешней сети для отправки данных обработки, поэтому теперь на компьютере XP есть две сетевые карты. Однако сообщения, отправленные во внешнюю сеть, не должны появляться в сети, соединяющей встроенные системы вместе (не нужно использовать полосу пропускания), а сообщения для встроенных систем не должны появляться во внешней сети.
Итак, я делаю утверждение, что сообщения, отправленные на определенный IP-адрес, отправляются на обе сетевые карты при использовании метода TcpClient.Connect.
Как указать, через какие физические сетевые карты отправляются сообщения, в идеале с помощью сетевого API .Net. Если в .Net такого метода нет, я всегда могу P / Invoke Win32 API.
Skizz
@sven: IP-адрес внешней сети (не встроенной сети) полностью вне моего контроля. Политики в этой сети устанавливаются системными администраторами сайтов, на которых будет использоваться машина (это может быть статический адрес, DHCP, та же подсеть, другая подсеть, pidgeon оператора связи и т. д.).





По сути, после успешного выполнения метода TcpClient.Connect он создаст сопоставление между физическим MAC-адресом встроенной системы и маршрутом, который он должен пройти к этому адресу (т. Е. Какую сетевую карту использовать).
Я не верю, что все сообщения, отправленные через соединение TcpClient, будут отправляться через обе сетевые карты.
У вас есть какие-то данные, чтобы предположить обратное, или вы слабо догадываетесь?
На самом деле я мало что знаю о внутренней работе сетей, поэтому я просто догадывался. Рассматриваемая машина расположена в нескольких милях вниз по дороге, и я надеюсь, что смогу получить на ней временной интервал, чтобы подключить сниффер к адаптеру «внешней сети» (то есть к тому, к которому встроенная система не подключена) и посмотреть что выходит. Ничто не сравнится с достоверными данными.
Xp поддерживает таблицу маршрутизации, в которой отображает диапазоны IP-адресов для сетей и шлюзов.
вы можете просмотреть таблицу с помощью «печати маршрута», с помощью «добавления маршрута» вы можете добавить маршрут к вашему встроенному устройству.
Siebenga: Я устал от команды «route print» на ноутбуке с беспроводными и проводными адаптерами, и все пункты назначения были указаны дважды, по одному для каждого адаптера. Но полезный инструмент.
Попробуйте использовать Socket для своего клиента вместо класса TcpClient.
Затем вы можете использовать Socket.Bind для таргетинга на свой локальный сетевой адаптер.
int port = 1234;
IPHostEntry entry = Dns.GetHostEntry(Dns.GetHostName());
//find ip address for your adapter here
IPAddress localAddress = entry.AddressList.FirstOrDefault();
IPEndPoint localEndPoint = new IPEndPoint(localAddress, port);
//use socket instead of a TcpClient
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//binds client to the local end point
client.Bind(localEndPoint);
http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.bind.aspx
Я разберусь с этим. Это, безусловно, выглядит многообещающе. Подключение к встроенной сети фиксировано, поэтому в процессе исключения должна быть возможность найти IP-адрес другого адаптера.
Если у вас на машине две сетевые карты, то проблем быть не должно. Нормальное поведение IP должно гарантировать, что трафик вашей «частной» сети (в данном случае встроенных систем) отделен от вашей общедоступной сети, и вам не придется ничего делать в своем коде. Все, что требуется, - это чтобы две сети находились в разных IP-подсетях и чтобы ваша «общедоступная» сетевая карта использовалась по умолчанию.
Предполагая, что ваши две сетевые карты настроены следующим образом:
NIC A (Public): 192.168.1.10 mask 255.255.255.0
NIC B (Private): 192.168.5.10 mask 255.255.255.0
Единственная конфигурация, которую вам нужно проверить, - это сетевая карта A по умолчанию. Когда вы пытаетесь отправить пакеты на любой адрес в вашей частной сети (192.168.50.0 - 192.168.50.255), ваш IP-стек будет искать в таблице маршрутизации и видеть напрямую подключенную сеть и пересылать трафик через частную сетевую карту. Любой трафик в (напрямую подключенной) общедоступной сети будет отправлен на NIC A, как и трафик на любой адрес, для которого у вас нет более конкретного маршрута в вашей таблице маршрутизации.
Ваша таблица маршрутизации (netstat -rn) должна выглядеть примерно так:
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.10 266 <<--
127.0.0.0 255.0.0.0 On-link 127.0.0.1 306
127.0.0.1 255.255.255.255 On-link 127.0.0.1 306
127.255.255.255 255.255.255.255 On-link 127.0.0.1 306
169.254.0.0 255.255.0.0 On-link 192.168.1.10 286
169.254.255.255 255.255.255.255 On-link 192.168.1.10 266
192.168.1.0 255.255.255.0 On-link 192.168.1.10 266
192.168.1.10 255.255.255.255 On-link 192.168.1.10 266
192.168.1.255 255.255.255.255 On-link 192.168.1.10 266
192.168.5.0 255.255.255.0 On-link 192.168.5.10 266
192.168.5.10 255.255.255.255 On-link 192.168.5.10 266
192.168.5.255 255.255.255.255 On-link 192.168.5.10 266
255.255.255.255 255.255.255.255 On-link 192.168.1.10 276
255.255.255.255 255.255.255.255 On-link 192.168.5.10 276
===========================================================================
Также будут несколько маршрутов многоадресной рассылки (начиная с 224), которые были опущены для краткости. «<< -» указывает маршрут по умолчанию, который должен использовать общедоступный интерфейс.
Не будет ли это зависеть от IP-адреса, к которому вы хотите подключиться? Или они находятся в одной подсети?