2017-09-14 10 views
0

rawソケットパケット転送用に次のpythonスクリプトを使用しています。パケット転送は問題ありませんが、相手側から着信パケットを印刷できません。Python raw socket receive issue

from socket import socket, AF_PACKET, SOCK_RAW 

s = socket(AF_PACKET, SOCK_RAW) 
s.bind(("eth0", 0)) 
src_addr = "\x54\xbe\xf7\x40\xf5\x82" 
dst_addr = "\xff\xff\xff\xff\xff\xff" 

payload = ("[("*30)+"Hello"+("]"*30) 
checksum = "\x1a\x2b\x3c\x4d" 

data = payload+checksum 

s.send(dst_addr+src_addr+data) 

#for receive function 

response=s.recv(4096) 
print response 
s.close() 
+0

受信側何かエラーがありますか? printステートメントの出力は何ですか? – BrandonM

+0

msgsを受信するサーバーは常にアクティブである必要がありますが、ソケットを閉じたようです。 –

+0

いいえ "プリントレスポンス" Brandonからプリントを取得しています。それは待っているrecv fnで続ける。クライアントから受け取った後でさえ。 –

答えて

0

socket関数の3番目の引数があります:。指定されていない場合、デフォルトは0です。AF_PACKET/SOCK_RAWの場合、引数は、受信するパケットの種類を指定します。値は、packet(7)のマニュアルページに記載されています。http://man7.org/linux/man-pages/man7/packet.7.html

実際に値がコアのpython2モジュールのどこにでも定義されているとは思いません。それらのうちのいくつかはscapy(http://www.secdev.org/projects/scapy/)で見つかるかもしれません。あるいは、定義されているところでlinuxヘッダファイルを見つけてください(/usr/include/linux/if_ether.h)。あなたのコードの

from socket import socket, AF_PACKET, SOCK_RAW, htons 

ETH_P_ALL = 3 
ETH_P_IP = 0x800 # Alternatively using this will receive the next IP packet 
s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) 
... 

その他のコメント:

ので、これを修正するためにコードを変更

書かれたとして、あなたが送っているパケットは、誰もが理解できることはほとんどありません。あなたはdstとsrcのMACアドレスを持っていますが、EtherTypeを提供していません。代わりに、最初の "[("はEtherTypeと見なされ、おそらくパケットの受信者には意味をなさないので廃棄されます)

また、未処理のソケットでは、プロトコルで指定したタイプの次のパケットを受信しようとしていますが、これは必ずしも送信したパケットに対する応答ではありません(実際にはそうではありません)。

0

ありがとう私は以下のスクリプトでパケットを受け取ることができますが、まだ複数の応答パケットを印刷することで問題が発生しています(ループ中)。

from socket import socket, AF_PACKET, SOCK_RAW, htons 
from struct import * 
import select 
import time 

ETH_P_ALL = 3 
ETH_P_IP = 0x800 
s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) 
s.bind(("eth0", 0)) 

src_addr = "\x54\xbe\xf7\x40\xf7\x82" 
dst_addr = "\xff\xff\xff\xff\xff\xff" 
l = "\x00\x21" 

ethertype = "\x08\x01" 

a ="\x00\x10\x00\x10\x00\x10" 
b = "\x00\x11\x00\x11\x00\x11" 

payload = ethertype + l + a + b 

for i in range(5): 

    time.sleep(5) 
    s.send(dst_addr+src_addr+ payload) 
    message=s.recv(4096) 
    print message