は、そう...思いやりてください。 私は必要な特権を持っています。パイソンICMP rawソケットの実装
は今、サーバ iは、そのように定義され:
host = socket.gethostbyname(socket.gethostname())
address = (host, 22224)
sockSer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
sockSer.bind(address)
sockSer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
packet, addr = sockSer .recvfrom(4096) # wait for packet from client
Q1)なぜ単に入力することはできません:ホスト= 'localhostは'。 これを行うと、sockSer.ioctl(socket.SIO_RCVALL、socket.RCVALL_ON)という行を書くことができなくなります。サーバーはクライアントのメッセージを受信しません。 gethostbyname(socket.gethostname())を実行している場合にのみ、私は192.168.1.101 を取得して動作します。異なるクラスの
: クライアントソケット:
host = socket.gethostbyname(socket.gethostname())
address = (host, 22224)
sockCli = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
Q2)は私も入力する必要があります:sockCli.ioctl(socket.SIO_RCVALL、socket.RCVALL_ON) または多分sockCli .connect(アドレス)? connectコマンドなしで動作するようです。クライアントソケットの ? 1)クライアントからサーバにパケットを送信します:
header=...
payload='a'
sockCli.sendto(header + payload, address)
2)は、サーバにパケットを受信し、クライアントに何かを送る:
while(true):
data, addr = sockSer.recvfrom(4096)
header2=...
payload2='b'
sockSer.sendto(header2 + payload2, addr)
は今、問題は、私は次の操作を行うときに発生します
今、私の重要な質問は: Q3)サーバはペイロード 'b'を使ってクライアントに1パケットだけを送りました。 クライアントは実際にはwhileループで2パケットを受信します。 最初のパケットはクライアント自体がサーバに送信され、もう1つのパケットはクライアントがサーバから取得したものです。 したがって私の出力は単に 'b'の代わりに 'ab'です なぜこれが起こっていますか?
注:私はコード全体を入力しませんでしたが、私の構文、解析、ヘッダの構成などは正しいと思います。 私のコードに明らかな問題はありますか? 必要に応じてコード全体をアップロードします。
ありがとう
あなたのシステムがそれらを許可しないように構成されていない限り、Rawソケットはループバックインターフェイス上でうまく動作するはずです。 –
インターネットコントロールメッセージプロトコルソケットは、ホストとの間でデータを送信するために使用されません。ホストに短い制御メッセージを送信するためのものです。そのため、接続する必要はありません。 –
ところで、通常のUDPの代わりにICMP(本当にデータ転送に使用されるはずのものではない)を使用する理由は何ですか? –