Управление тем, на какую сетевую карту отправляются сообщения TCP / IP - PullRequest
4 голосов
/ 08 сентября 2008

Система, над которой я сейчас работаю, состоит из контроллера ПК под управлением XP с .Net 2, подключенного к набору встроенных систем. Все эти компоненты взаимодействуют друг с другом через сеть Ethernet. В настоящее время я использую TcpClient.Connect на компьютере XP, чтобы открыть соединение со встроенными системами для отправки сообщений TCP / IP.

Теперь мне нужно подключить компьютер XP к внешней сети для отправки данных обработки, поэтому на компьютере XP теперь есть две сетевые карты. Однако сообщения, отправляемые во внешнюю сеть, не должны появляться в сети, соединяющей встроенные системы (не хотят использовать пропускную способность), а сообщения во встроенные системы не должны появляться во внешней сети.

Итак, я утверждаю, что сообщения, отправленные на определенный IP-адрес, отправляются на обе сетевые карты при использовании метода TcpClient.Connect.

Как мне указать, через какие физические сетевые сообщения отправляются сообщения, в идеале с помощью сетевого API .Net. Если в .Net такого метода не существует, я всегда могу P / Invoke API Win32.

Skizz

Ответы [ 4 ]

6 голосов
/ 08 сентября 2008

Попробуйте использовать 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

2 голосов
/ 14 сентября 2008

Если у вас есть две сетевые карты на машине, то проблем быть не должно. Нормальное поведение 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

Единственная конфигурация, которую вам нужно проверить, это то, что NIC 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), которые были опущены для краткости. «<< -» указывает маршрут по умолчанию, который должен использовать открытый интерфейс. </p>

1 голос
/ 08 сентября 2008

Xp поддерживает таблицу маршрутизации, в которой он сопоставляет диапазоны IP-адресов с сетями и шлюзами.

вы можете просматривать таблицу, используя «route print», с помощью «route add» вы можете добавить маршрут к встроенному устройству.

1 голос
/ 08 сентября 2008

По существу, после успешного выполнения метода TcpClient.Connect будет создано сопоставление между физическим MAC-адресом встроенной системы и маршрутом, по которому он должен идти по этому адресу (то есть, какую сетевую карту использовать). *

Я не верю, что все сообщения, отправленные по соединению TcpClient, будут отправлены через обе сетевые карты.

У вас есть какие-либо данные, чтобы предположить обратное, или вы дурно догадаетесь?

...