So senden Sie eine Binärnachricht in TCP und speichern die Antwort

0

Ich muss einen Client für ein proprietäres Protokoll entwickeln, und es wäre sehr nützlich, das Verhalten des vorhandenen Servers zu verstehen, indem ich ihm benutzerdefinierte Nachrichten sende und die Antwort betrachte. "Telnet" wäre für diesen Zweck perfekt, mit der Ausnahme, dass das Protokoll binär ist.

Derzeit habe ich die gewünschte Nachricht (mit einem Hex-Editor) in eine Datei geschrieben mymsgund versuche, sie mit Netcat auf folgende Weise zu senden:

cat msg | netcat 127.0.0.1 1234

Mein Problem dabei ist, dass Netcat nur stoppt, nachdem es EOF erreicht hat, sodass ich nie die Antwort des Servers sehen kann. Irgendwelche Vorschläge?

(Natürlich kann man ein Mock-up des proprietären Servers mit ausführen nc -l -p 1234)

user229790
quelle

Antworten:

1

Ich bin ein wenig verwirrt, weil ich dachte, dass Netcat eine explizite Funktion hat, um genau diesen Fall zu behandeln. Ich dachte, dass es gewartet hat, bis es EOFs sowohl von der Standardeingabe als auch von der Buchse erhalten hat. Vielleicht ist es nur eine Auszeit; Sehen Sie in Ihrer Netcat-Dokumentation nach, ob es eine Option gibt, nach Erhalt von EOF on stdin für eine bestimmte Zeit vom Socket zu lesen.

Oder Sie können die Kludge-Antwort verwenden:

(cat msg; sleep 42) | netcat 127.0.0.1 1234
Scott
quelle
Ich denke, die Option, die Sie erwähnen, ist -w N. Es funktioniert nicht sofort für mich :(. Auch ich könnte etwas vermissen, aber die Kludge-Lösung nimmt keine Eingabe, während es im Schlaf-Teil ist, so ist das ein Problem!
user229790
@ user229790: Ich denke -wmacht etwas anderes, es steht explizit "Wenn eine Verbindung und stdin länger als ... im Leerlauf sind", ist EOF nicht im Leerlauf. -iauf der anderen Seite klingt es so, als wäre es einen Versuch wert: "Gibt ein Verzögerungszeitintervall zwischen gesendeten und empfangenen Textzeilen an."
Bobby
0

Ich habe mir dieses Python-Skript ausgedacht, um den Job zu erledigen.

#!/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
user229790
quelle