Отправка данных между двумя сетевыми интерфейсами на одном устройстве - PullRequest
3 голосов
/ 20 февраля 2010

Я хотел бы отправить данные между двумя сетевыми интерфейсами, которые подключены с помощью перекрестного кабеля в Linux. Два интерфейса Ethernet находятся на одной коробке. Я определил, что интерфейсы Ethernet имеют разные статические IP-адреса (1.2.3.4 и 5.6.7.8) и используют сокеты для отправки байтов с одного IP-адреса на другой. Я хочу подчеркнуть, что я хочу, чтобы данные покидали один интерфейс блока и получали их на другом интерфейсе того же блока. Одним из следствий этого является то, что отключение кабеля предотвратит связь между клиентом и сервером на одном и том же устройстве.

Ядро умнее меня, я думаю, и решает, что ему не нужно отправлять информацию по проводам и направляет данные непосредственно между сокетами внутри, что сводит на нет тест. Я пытался использовать SO_BINDTODEVICE, чтобы заставить клиента отправлять данные из определенного интерфейса, но сервер его никогда не видит. Я действительно застрял, и это не должно быть так сложно.

В таблице маршрутов есть две записи -n

Dest       Gateway    Genmask        flags  metric  use  interface
1.2.3.0    0.0.0.0    255.255.255.0    U       0     0   eth0
5.6.7.0    0.0.0.0    255.255.255.0    U       0     0   eth1

Ответы [ 2 ]

1 голос
/ 20 февраля 2010

Вы не можете общаться с помощью IP между 1.2.3.4/24 до 5.6.7.8/24 без прохождения через маршрутизатор.Проблема в том, что IP может общаться только с другими компьютерами в том же сегменте сети.Чтобы рассчитать сетевой адрес, вам нужно сделать логику И между адресом интерфейса и маской подсети.Это даст вам сетевые адреса.Если два сетевых адреса отличаются, то потребуется маршрутизатор.В вашем примере у вас будет сетевой адрес 1.2.3.0 и 5.6.7.0.Поскольку они разные, они будут отправлять данные.

Что более важно, большинство сетевых стеков достаточно умны, чтобы видеть, что, если оба интерфейса находятся на одном компьютере, он не будет отправлять данные полностью на физический интерфейс.Вероятно, он отправит сообщение только через стек IP.Но опять же, для его работы необходимо указать vaild адрес.

Вы даже сможете протестировать подобную настройку, используя только петлевые сетевые устройства.(виртуальные сетевые карты.)

1 голос
/ 20 февраля 2010

Попробуйте использовать следующие два IP-адреса:

  • 192.168.64.1
  • 192.168.64.2

Я не уверен, что это проблема, но 1.2.3.4 и 5.6.7.8 не находятся в одной подсети. (Потому что, когда вы применяете маску к каждому из них, вы не получаете тот же сетевой адрес, как показывает столбец Dest.)

...