2015-01-27 3 views
2

Я пытаюсь связаться с платой FPGA, на которой был реализован базовый протокол UDP. Я использую Windows 7 ПК, python 2.7.6 32 бит.Отправить сообщение udp вне подсети

мой компьютер подключен к локальной сети. автоматически получает этот IP-адрес (из ipconfig): IP 192.168.2.1, Маска подсети: 255.255.255.0

Моя плата подключена к компьютеру с помощью переключателя. IP платы фиксирован (в аппаратном коде) - 192.168.4.10.

если я правильно понимаю - мой компьютер и моя плата находятся в разных подсетях, потому что 2 из 4 правых ip-номеров отличаются.

Когда я отправляю UDP-пакет, он не получает его. когда я вручную заставляю свой компьютер быть тем же самым ip (192.168.2.1), но 255.255.0.0 маску подсети, он получает.

код Python я использовать для отправки что-то вроде этого:

import socket 

UDP_IP = "192.168.4.10" 
RECEIVE_PORT = 5005 
SEND_PORT = 5005 
MESSAGE = "Hello, World!" 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock .bind(('', SEND_PORT)) 
sock.sendto(MESSAGE, (UDP_IP, RECEIVE_PORT)) 

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

ответ

3

На самом деле вы должны использовать "IP-адрес псевдоним", чтобы иметь оба 192.168.2.1/255.255.255.0 и, скажем, 192.168.4.1/255.255.255.0 на один порт Ethernet на вашем компьютере:


Что произошло, когда вы отправили дейтаграмму UDP до 192.168.4.10 от 192.168.2.1/255.255.255.0:

  1. Сетевые адреса вашего компьютера и назначения были разные: 192.168.4.0 против 192.168.2.0
  2. Поэтому ваш компьютер предположил, что это должен был спросить маршрутизатор шлюза надлежащим образом доставить дейтаграмму где-то далеко, и отправил его в маршрутизатор (подробности о том, как сделать это не имеет никакого значения здесь)
  3. Я предполагаю, что ваш маршрутизатор не знал ничего о 192.168.4.0 сети и пришлось отказаться от дейтаграммы

Что произошло, когда вы послали UDP датаграмм 192.168.4.10 из 192.168.2.1/255.255.0.0:

  1. Сетевых адреса вашего компьютера и назначения договорился: 192.168.0.0
  2. Таким образом, ваш компьютер предположил, что это не должно беспокоить маршрутизатор шлюза и может напрямую поговорить с ним
  3. Затем следующим шагом был запрос MAC-адреса получателя по протоколу ARP (Address Resolution Protocol).) Он просто использует Ethernet-трансляцию, чтобы спросить все устройства, подключенные к вашей локальной сети, который является владельцем 192.168.4.10
  4. Поскольку нет понятия подсети в ARP/Ethernet, ваш сетевой адаптер FPGA просто ответил что-то вроде «Да, у меня есть 192.168.4.10. меня в d8:cb:8a:f0:0b:aa "
  5. Вашего компьютера может послать UDP датаграммы d8:cb:8a:f0:0b:aa
    • FYI: подобный процесс должен быть, прежде чем произошел ваш компьютер может говорить с маршрутизатором шлюза.
+0

Если вам повезет, ваш удаленное устройство также прослушивает многоадресной UDP или передачи, и вы можете получить пакет через к нему таким образом. если вы также слушаете многоадресную/широковещательную рассылку UDP, вы можете получить ответ. НО ТОЛЬКО, если удаленное устройство KNOWS отвечает на ваш аппарат через многоадресный/широковещательный UDP. Если вы застряли в одноадресной рассылке UDP, то @nodakai дает единственное, что есть - добавьте псевдоним вашей сетевой карты (если можете). –

+0

PS: Добавление псевдонима программно является нетривиальным. (1) быть администратором, (2) заставить сетевой адаптер быть STATIC IP-адресом (если он в настоящее время является DHCP), (3) добавить псевдоним. Нет никакого независимого от ОС способа сделать все это. И я не знаю, что такое python networking достаточно хорошо, чтобы предлагать. –

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

  • Нет связанных вопросов^_^