我需要在幾天內完成一個項目,它是一個基本的客戶端和服務器接口。問題在於它需要成爲所有原始插座。我沒有創建的問題,我只是堅持發送數據包。我如何發送python中的原始以太網幀
首先,我嘗試將它綁定到接口'en1',但它一直給我一個錯誤nodename not known
。當我將它綁定到我的本地IP地址時,它工作正常。在完成這個之後,我創建了一個原始數據包類,它的全部以十六進制表示然後,我發了一個sendto電話給他發送電報。
問題是,當我使用wireshark捕獲數據包時,它顯示爲ipv4數據包的有效負載。我不想讓它自動生成頭文件,這就是我的原始數據包類的原因。你知道我可以拿出這些標題嗎?
這裏是我的代碼 - 唯一的原始功能:
def raw():
HOST = gethostbyname('192.168.1.10')
s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)
s.bind((HOST, 0))
s.setsockopt(IPPROTO_IP, IP_HDRINCL, 0) #no headers - it wont work!!
pckt = packet("\x68\x65\x6c\x6c\x6f")
netpacket = pckt.getpacket()
print "Sending.. "
print ""
s.sendto(netpacket, ('192.168.1.1', 80))
data = s.recv(4096)
print data
O和這裏是在最後一個hello捕獲的數據包:
007f 2809 6da2 28cf daee 2156 0800 4500 004d 1bfc 0000 4000 db59 c0a8 010a c0a8 0101* 007f
2809 6da2 28cf daee 2156 0800 4500 0036 2352 4000 4006 0000 c0a8 010a c0a8 0101 15c0 0050
0000 0000 0000 0000 8010 813b 0000 68656c6c6f -hello
*這是負載起始即使它應該是數據包的開頭 也我不打算使用任何其他模塊,我必須使用套接字。
有趣的問題,我真的不能幫助,但也許這個問題是相關的:http://stackoverflow.com/questions/6329583/how-to-reliably-generate- ethernet-frame-errors-in-software –
耐心是一種美德。另外請記住,讓你的問題更容易閱讀,更容易有人可以快速理解你的問題的性質,並提出一個有用的解決方案(提示:正確的大寫和段落分段幫助很多) – talonmies
其他示例使用AF_PACKET,而不是AF_INET,如果你正在運行Linux,你可能想嘗試它,因爲它似乎是Linux特定的。 –