Como enviar uma mensagem binária em TCP e armazenar a resposta

Como enviar uma mensagem binária em TCP e armazenar a resposta

Tenho que desenvolver um cliente para um protocolo proprietário e seria muito útil poder entender o comportamento do servidor existente enviando-lhe mensagens customizadas e ver a resposta. "Telnet" seria perfeito para esse propósito, exceto pelo fato de o protocolo ser binário.

Atualmente, escrevi a mensagem que desejo (usando um editor hexadecimal) em um arquivo mymsge estou tentando enviá-la usando o netcat desta forma:

cat msg | netcat 127.0.0.1 1234

Meu problema com isso é que o netcat simplesmente para depois de atingir o EOF, então nunca consigo ver a resposta do servidor. Alguma sugestão?

(é claro, pode-se executar uma maquete do servidor proprietário usando nc -l -p 1234)

Responder1

Estou um pouco confuso, porque pensei que o netcat tivesse um recurso explícito para lidar com esse caso. Achei que ele esperou até obter EOFs da entrada padrão e do soquete. Talvez seja apenas uma questão de tempo limite; verifique a documentação do netcat para ver se há uma opção para continuar lendo do soquete por um determinado período de tempo após obter o EOF no stdin.

Ou você pode usar a resposta kludge:

(cat msg; sleep 42) | netcat 127.0.0.1 1234

Responder2

Eu criei esse script python para fazer o trabalho.

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

informação relacionada