2012-09-01 45 views
4

我需要在幾天內完成一個項目,它是一個基本的客戶端和服務器接口。問題在於它需要成爲所有原始插座。我沒有創建的問題,我只是堅持發送數據包。我如何發送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 

*這是負載起始即使它應該是數據包的開頭 也我不打算使用任何其他模塊,我必須使用套接字。

+0

有趣的問題,我真的不能幫助,但也許這個問題是相關的:http://stackoverflow.com/questions/6329583/how-to-reliably-generate- ethernet-frame-errors-in-software –

+0

耐心是一種美德。另外請記住,讓你的問題更容易閱讀,更容易有人可以快速理解你的問題的性質,並提出一個有用的解決方案(提示:正確的大寫和段落分段幫助很多) – talonmies

+1

其他示例使用AF_PACKET,而不是AF_INET,如果你正在運行Linux,你可能想嘗試它,因爲它似乎是Linux特定的。 –

回答

5

感謝這個問題的意見,我設法得到一個連接與服務器。所需要的只是在linux中將地址族更改爲af_packet。然後我將它綁定到我的網站併發送它。有效。感謝幫助的人們! 這裏是一些示例代碼:

s = socket(AF_PACKET, SOCK_RAW) 
s.bind(("en1", 0)) 
pckt = packet() #my class that initializes the raw hex 
data = pckt.getpacket() 
s.send(data) 
message = s.recv(4096) 
print s 
print s.decode('hex') 

它需要在Linux或Debian的。我知道它不適用於mac osx。 idk關於windows。如果你有一個mac使用pycap或scapy,他們工作得很好。

+0

感謝分享!你可以發佈一個發送字符串或其他東西的例子嗎?目前還不清楚你的「數據包」類抽象了多少「魔術」。 –

+0

我無法在此處發佈代碼,因此請參閱以下有關適用於我的數據剪輯。 – CyberFonic

0

在回答你的問題安德魯,這裏有一個例子:

這個答案讓我獲得網絡喚醒工作。在這種情況下,數據是:

preamble = bytearray((0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF)) 
MAC = bytearray((0x00, 0x14, 0x85, 0xa4, 0x73, 0xce)) 
data = PREAMBLE + 16*MAC