2010-05-23 11 views
5

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.

Respuesta

7

Probablemente necesite terminar su msg con algún tipo de "caracteres de final de línea" - tal vez \r\n, quizás solo uno de los dos. Cuando estás en telnet, ¿no finalizaste tu texto mecanografiado presionando una tecla Retorno o Entrar? En el código de Python, no estás haciendo el equivalente a eso.

+0

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

+1

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

0

Necesita flush el zócalo justo después del send, para forzar que la pila TCP envíe realmente los datos. De lo contrario, esperará a que se envíen más datos para poder completar un paquete de manera efectiva. Mientras espera una respuesta del servidor, nada se ha enviado todavía.

+0

Probé una descarga() en la versión del objeto de archivo, sin ningún cambio en el comportamiento. No parece haber un método flush() para socket que funcione con socket.write (?). – mix

Cuestiones relacionadas