TCPでバイナリメッセージを送信し、応答を保存する方法

TCPでバイナリメッセージを送信し、応答を保存する方法

独自のプロトコル用のクライアントを開発する必要があり、カスタム メッセージを送信して応答を確認することで既存のサーバーの動作を理解できれば非常に便利です。プロトコルがバイナリであることを除けば、「Telnet」はその目的に最適です。

そのため、現在、必要なメッセージを(16進エディタを使用して)ファイルに書き込みmymsg、次のようにnetcatを使用して送信しようとしています。

cat msg | netcat 127.0.0.1 1234

問題は、netcat が EOF に到達した後に停止してしまうため、サーバーの応答がまったく表示されないことです。何か提案はありますか?

(もちろん、を使用して独自のサーバーのモックアップを実行することもできますnc -l -p 1234)

答え1

私は少し困惑しています。なぜなら、netcat にはまさにこのケースを処理するための明示的な機能があると思っていたからです。標準入力とソケットの両方から EOF を取得するまで待機するものだと思っていました。おそらくこれは単なるタイムアウトの問題です。netcat のドキュメントをチェックして、stdin で EOF を取得した後、一定時間ソケットから読み取りを続けるオプションがあるかどうかを確認してください。

あるいは、その場しのぎの答えを使うこともできます:

(cat msg; sleep 42) | netcat 127.0.0.1 1234

答え2

この仕事をするために、私はこの Python スクリプトを思いつきました。

#!/usr/bin/env python

import socket
import sys

if (len(sys.argv) != 3):
    print "usage: " + sys.argv[0] + " host port <message >answer"
    print ""
    print "if you want to create a fake server side: nc -l -p port"
else:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((sys.argv[1], int(sys.argv[2])))
    msg = sys.stdin.read()
    s.send(msg)
    answer = s.recv(1024)
    print answer

関連情報