数日でプロジェクトを完成させる必要があります。これは、基本的なクライアントとサーバーのインターフェイスです。問題は、すべて生のソケットである必要があることです。それを作成することに問題はありません。パケットの送信に固執しています。
最初にインターフェイス「en1」にバインドしようとしましたが、エラーが発生し続けますnodename not known
。ローカル IP アドレスにバインドすると、正常に動作します。これを完了した後、すべて 16 進数の raw パケット クラスを作成しました。次に、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
最後に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
*これ ( 0101
) は、パケットの先頭であるはずが、ペイロードの先頭です。また、他のモジュールを使用するつもりはありません。ソケットを使用する必要があります。