2014-10-17 126 views
0

我在接收從python程序中的FPGA發送的UDP數據包時遇到問題。我檢查了類似的問題,也做了以下內容:在Python中無法接收UDP數據包

  • 經過,Wireshark才能看到的UDP數據包
  • 禁用Windows防火牆在PC
  • 使用sock.bind(),因爲它是UDP數據包
  • 手動設置以太網幀的目的地MAC地址,因爲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 另一個python腳本(在10.10.10網絡中的另一臺電腦)測試接收器腳本作品精細。我甚至嘗試從我知道收到的包(不同點是源IP,端口& MAC,校驗和(禁用),標識)的數據包在FPGA中逐字節地重新創建UDP數據包。

下面是輸出針對這兩個分組從Wireshark的:

Wireshark UDP packet(也被接收到的OK左邊,也就是不Python右側獲得賽靈思FPGA包Python的UDP數據包)不知道還有什麼要嘗試。任何幫助,將不勝感激。

+0

*旁白*:將'UDP_IP'設置爲您的本地地址過於具體。相反,請執行'UDP_IP ='''綁定到所有接口。這不會解決今天的問題,但可能會在未來防止出現問題。 – 2014-10-17 16:14:33

回答

0

顯然,FPGA計算中的IPv4頭校驗和是錯誤的。由於TTL(生存時間)在路由器跳變時發生變化,因此可能會產生混淆,新的TTL也會更改IPv4報頭,從而每跳都會產生一個新的校驗和,直到它到達接收端的Wireshark。默認情況下,Wireshark的IPv4校驗和驗證被禁用(在問題截圖中可以看到),答案更容易在驗證時發現。

我在數據包構造過程中將IPv4校驗和設置爲零(x0000)。它會在路由器處正確重新計算,並且使用正確的校驗和Python可以接收數據包。

我還測試了從FPGA到主機PC的直接連接(無路由器)。 IPv4頭也得到了正確的重新計算(我不知道在哪裏,可能是PC的NIC?)

希望這對有類似問題的人有用。