Мне нужно разработать клиент для собственного протокола, и было бы очень полезно иметь возможность понять поведение существующего сервера, отправляя ему пользовательские сообщения и просматривая ответ. «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