Estoy tratando de escribir un cliente basado en socket simple en Python que se conectará a un servidor telnet. Puedo probar el servidor al telnet en su puerto (5007) y al ingresar texto. Responde con un NAK (error) o un AK (éxito), a veces acompañado por otro texto. Parece muy simple.La conexión de socket a un servidor basado en telnet se cuelga al leer
Escribí un cliente para conectarme y comunicarme con el servidor, pero se cuelga en el primer intento de leer la respuesta. La conexión es exitosa. Las consultas como getsockname y getpeername son exitosas. El comando enviar devuelve un valor que es igual al número de caracteres que estoy enviando, por lo que parece estar enviando correctamente. Pero al final, siempre se bloquea cuando trato de leer la respuesta.
He intentado usar tanto objetos basados en archivos como readline y write (a través de socket.makefile), como también usar send y recv. Con el objeto de archivo intenté hacerlo con "rw" y leer y escribir a través de ese objeto, y luego probé un objeto para "r" y otro para "w" para separarlos. Ninguno de estos funcionó.
Usé un sniffer de paquetes para ver lo que está pasando. No soy versado en todo lo que estoy viendo, pero durante una sesión de Telnet puedo ver mi texto mecanografiado y el texto del servidor volviendo. Durante mi conexión de socket Python, puedo ver que mi texto va al servidor, pero parece que los paquetes no tienen texto.
¿Alguna idea sobre lo que estoy haciendo mal o alguna estrategia para probar?
Aquí está el código que estoy usando (en este caso, es con envío y recv):
#!/usr/bin/python
host = "localhost"
port = 5007
msg = "HELLO EMC 1 1"
msg2 = "HELLO"
import socket
import sys
try:
skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, e:
print("Error creating socket: %s" % e)
sys.exit(1)
try:
skt.connect((host,port))
except socket.gaierror, e:
print("Address-related error connecting to server: %s" % e)
sys.exit(1)
except socket.error, e:
print("Error connecting to socket: %s" % e)
sys.exit(1)
try:
print(skt.send(msg))
print("SEND: %s" % msg)
except socket.error, e:
print("Error sending data: %s" % e)
sys.exit(1)
while 1:
try:
buf = skt.recv(1024)
print("RECV: %s" % buf)
except socket.error, e:
print("Error receiving data: %s" % e)
sys.exit(1)
if not len(buf):
break
sys.stdout.write(buf)
Oh, en caso de que sea útil, he aquí un ejemplo de sesión de telnet se hace manualmente:
ubuntu:~/mac/python$ telnet localhost 5007
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HELLO EMC 1 1
HELLO ACK EMCNETSVR 1.1
La primera línea 'HOLA' es lo que escribí, la segunda es la respuesta.
fabuloso, ¡lo hizo el truco! lo había intentado \ n antes (no funcionó) pero no estaba enterado de \ r. el color tampoco fue requerido. ¡Gracias! – mix
resultó que necesitaba el \ r \ n, no solo \ r. funciona en algunos casos, pero no en todos, lo cual es confuso. \ n por sí mismo no funcionó en ninguna. – mix