Как отправить двоичное сообщение в TCP и сохранить ответ

Как отправить двоичное сообщение в TCP и сохранить ответ

Мне нужно разработать клиент для собственного протокола, и было бы очень полезно иметь возможность понять поведение существующего сервера, отправляя ему пользовательские сообщения и просматривая ответ. «Telnet» идеально подошел бы для этой цели, за исключением того, что протокол является двоичным.

Итак, в настоящее время я записал нужное мне сообщение (используя шестнадцатеричный редактор) в файл mymsgи пытаюсь отправить его с помощью netcat следующим образом:

cat msg | netcat 127.0.0.1 1234

Моя проблема в том, что netcat просто останавливается после достижения EOF, поэтому я никогда не вижу ответа сервера. Есть предложения?

(конечно, можно запустить макет собственного сервера, используя nc -l -p 1234)

решение1

Я немного озадачен, потому что я думал, что у netcat есть явная функция для обработки только этого случая. Я думал, что он ждет, пока не получит EOF как из стандартного ввода, так и из сокета. Может быть, это просто тайм-аут; проверьте документацию netcat, чтобы узнать, есть ли возможность продолжать чтение из сокета в течение определенного времени после получения EOF на stdin.

Или вы можете использовать ответ-загадку:

(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

Связанный контент