Контролиране на коя мрежова карта се изпращат TCP/IP съобщения

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

Сега трябва да свържа компютъра с XP към външна мрежа, за да изпращам данни за обработка, така че вече има две мрежови карти на компютъра с XP. Въпреки това съобщенията, изпратени до външната мрежа, не трябва да се показват в мрежата, свързваща вградените системи заедно (не искат да консумират честотната лента) и съобщенията до вградените системи не трябва да се показват във външната мрежа.

И така, твърдението, което правя, е, че съобщенията, изпратени до определен IP адрес, се изпращат и на двете мрежови карти, когато се използва методът TcpClient.Connect.

Как да посоча през коя физическа мрежова карта се изпращат съобщения, като в идеалния случай използвам .Net networking API. Ако такъв метод не съществува в .Net, тогава винаги мога да P/извикам Win32 API.

Skizz


person Skizz    schedule 08.09.2008    source източник
comment
Това няма ли да зависи от IP адреса, който искате да достигнете?, или те са в една и съща подмрежа?   -  person sven    schedule 08.09.2008
comment
@sven: IP адресът на външната мрежа (не на вградената мрежа) е напълно извън моя контрол. Правилата в тази мрежа зависят от системните администратори на сайтовете, където ще се използва машината (може да е статичен адрес, dhcp, същата подмрежа, различна подмрежа, превозвач и т.н.).   -  person Skizz    schedule 08.09.2008


Отговори (4)


Опитайте да използвате Socket за вашия клиент вместо TcpClient Class.

След това можете да използвате 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

person Hath    schedule 08.09.2008
comment
Ще разгледам това. Определено изглежда обещаващо. Връзката с вградената мрежа е фиксирана, така че чрез процес на елиминиране трябва да е възможно да се намери IP адресът на другия адаптер. - person Skizz; 08.09.2008

Ако имате две мрежови карти на машината, тогава не би трябвало да има проблем. Нормалното поведение на IP трябва да гарантира, че трафикът за вашата „частна“ мрежа (вградени системи в този случай) е отделен от вашата публична мрежа, без да се налага да правите нещо във вашия код. Всичко, което се изисква, е двете мрежи да са в различни IP подмрежи и вашият „публичен“ NIC да бъде по подразбиране.

Ако приемем, че вашите две NIC са конфигурирани по следния начин:

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. Всеки трафик към (директно свързаната) публична мрежа ще бъде изпратен към 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), които са пропуснати за краткост. '‹‹--' показва маршрута по подразбиране, който трябва да използва публичния интерфейс.

person Murali Suriar    schedule 13.09.2008

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

Не вярвам, че всички съобщения, изпратени след това през TcpClient връзката, ще бъдат изпратени през двете мрежови карти.

Имате ли някакви данни, които да предполагат друго, или мърляво гадаете?

person samjudson    schedule 08.09.2008
comment
Всъщност не знам много за вътрешната работа на мрежите, така че просто предполагах. Въпросната машина се намира на няколко мили надолу по пътя и се надявам да успея да й осигуря времеви интервал, за да включа снифър в адаптера за „външна мрежа“ (т.е. този, към който не е свързана вградената система) и да видя какво излиза. Нищо не е по-добро от твърдите данни. - person Skizz; 08.09.2008

Xp поддържа таблица за маршрутизиране, където картографира диапазони от ip-адреси към мрежи и шлюзове.

можете да видите таблицата с помощта на „route print“, с „route add“ можете да добавите маршрут към вашето вградено устройство.

person Mendelt    schedule 08.09.2008
comment
Siebenga: Уморих командата „route print“ на лаптоп с безжични и кабелни адаптери и всички дестинации бяха изброени два пъти, по веднъж за всеки адаптер. Все пак полезен инструмент. - person Skizz; 08.09.2008