Tengo que desarrollar un cliente para un protocolo propietario y sería muy útil poder comprender el comportamiento del servidor existente enviándole mensajes personalizados y ver la respuesta. "Telnet" sería perfecto para ese propósito excepto que el protocolo es binario.
Actualmente, he escrito el mensaje que quiero (usando un editor hexadecimal) en un archivo mymsg
y estoy intentando enviarlo usando netcat de esta manera:
cat msg | netcat 127.0.0.1 1234
Mi problema con esto es que netcat simplemente se detiene después de llegar a EOF, por lo que nunca puedo ver la respuesta del servidor. ¿Alguna sugerencia?
(por supuesto, se puede ejecutar una maqueta del servidor propietario usando nc -l -p 1234
)
Respuesta1
Estoy un poco desconcertado, porque pensé que netcat tenía una característica explícita para manejar este caso. Pensé que esperó hasta obtener EOF tanto de la entrada estándar como del socket. Tal vez sea sólo una cuestión de tiempo de espera; consulte la documentación de netcat para ver si hay una opción para seguir leyendo desde el socket durante un cierto período de tiempo después de obtener EOF en la entrada estándar.
O puedes usar la respuesta chapucera:
(cat msg; sleep 42) | netcat 127.0.0.1 1234
Respuesta2
Se me ocurrió este script en Python para hacer el trabajo.
#!/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