Cómo enviar un mensaje binario en TCP y almacenar la respuesta

Cómo enviar un mensaje binario en TCP y almacenar la respuesta

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 mymsgy 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

información relacionada