2014-10-17 5 views
0

У меня возникли проблемы с получением пакета UDP, отправленного из FPGA в программе python. Я проверил аналогичные вопросы и сделал следующее:Не удается получить пакет UDP в Python

  • проверить, что Wireshark может увидеть пакеты UDP
  • нетрудоспособного брандмауэра Windows в ПК
  • использован sock.bind(), так как это пакеты UDP
  • вручную установить MAC-адрес назначения на Ethernet-фрейме, поскольку FPGA не поддерживает ARP
  • Установить IP-адрес для трансляции 10.10.255.255 для тестирования, не получено пакетов
  • Установить контрольную сумму UDP пакета от отправителя до 0x00 00

Вот код питона приемник:

import socket 
import sys 

UDP_IP = "10.10.10.87" 
UDP_PORT = 4660 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.bind((UDP_IP, UDP_PORT)) 
print("Socket: "+str(sock.getsockname())) 
while True: 
    data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes 
    print(data) 
    print(addr) 
    sys.stdout.flush() 

При испытании против другого питона скрипт, который отправляет 10.10.10.87:4660 (с другого компьютера в сети 10.10.10) приемник сценария работы хорошо. Я даже пытался воссоздать побайтовый байт UDP в FPGA из пакетов, которые, как мне известно, получены OK (Различия - это IP-адрес источника, порт & MAC, контрольные суммы (отключены), идентификация).

Вот результат для обоих пакетов из Wireshark:

Wireshark UDP packet (Python UDP пакет, который получает получил ОК слева, Xilinx FPGA пакет, который не получил от питона справа)

Я нахожусь не уверен, что еще попробовать. Любая помощь будет оценена по достоинству.

+0

* Рядом *: Установка 'UDP_IP' на ваш локальный адрес является чрезмерно конкретной. Вместо этого сделайте 'UDP_IP = '' 'для привязки ко всем интерфейсам. Это не решит сегодняшнюю проблему, но может предотвратить проблемы в будущем. –

ответ

0

Очевидно, что контрольная сумма заголовка IPv4 из расчета FPGA была неправильной. Это может запутать, потому что TTL (Time to Live) меняется на скачок маршрутизатора, а новый TTL также изменяет заголовок IPv4, заставляя новую контрольную сумму на каждый хоп до тех пор, пока он не попадет в Wireshark на конец приемника. По умолчанию Wireshark отключил проверку контрольной суммы IPv4 (как видно на скриншоте вопроса), ответ легче определить с помощью проверки.

Я установил контрольную сумму IPv4 при построении пакета до нуля (x0000). Он правильно вычисляется на маршрутизаторе, и с правильной контрольной суммой Python может получить пакет.

Я также проверил прямое соединение (без маршрутизатора) с FPGA на главный компьютер. Заголовок IPv4 также правильно пересчитан (я не уверен, где, возможно, сетевой адаптер ПК?)

Надеюсь, это полезно для кого-то с аналогичными проблемами.