2010-05-23 7 views
5

J'essaye d'écrire un client basé sur le socket simple en Python qui se connectera à un serveur telnet. Je peux tester le serveur en téléphonant à son port (5007), et en entrant du texte. Il répond par un NAK (erreur) ou un AK (succès), parfois accompagné d'un autre texte. Cela semble très simple.La connexion par socket à un serveur basé sur telnet se bloque

J'ai écrit un client pour me connecter et communiquer avec le serveur, mais il se bloque dès la première tentative de lecture de la réponse. La connexion est réussie. Des requêtes telles que getsockname et getpeername sont réussies. La commande send renvoie une valeur égale au nombre de caractères que j'envoie, elle semble donc envoyer correctement. Mais à la fin, il se bloque toujours quand j'essaie de lire la réponse.

J'ai essayé d'utiliser à la fois des objets basés sur des fichiers tels que readline et write (via socket.makefile), ainsi que d'utiliser send et recv. Avec l'objet fichier j'ai essayé de le faire avec "rw" et de lire et d'écrire via cet objet, et plus tard essayé un objet pour "r" et un autre pour "w" pour les séparer. Aucun d'entre eux a travaillé. J'ai utilisé un renifleur de paquets pour regarder ce qui se passait. Je ne suis pas versé dans tout ce que je vois, mais pendant une session telnet je peux voir mon texte dactylographié et le texte du serveur revenant. Pendant ma connexion socket Python, je peux voir mon texte aller sur le serveur, mais les paquets ne semblent pas contenir de texte.

Des idées sur ce que je fais de mal, ou des stratégies à essayer?

Voici le code que je utilise (dans ce cas, il est avec l'envoi et 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, dans le cas où il est utile, voici une session telnet exemple fait manuellement:

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 première ligne «HELLO» est ce que j'ai tapé, la seconde est la réponse.

Répondre

7

Vous avez probablement besoin de terminer votre msg avec une sorte de "caractères de fin de ligne" - peut-être \r\n, peut-être juste l'un des deux. Lorsque vous êtes dans telnet, n'avez-vous pas terminé votre texte tapé en appuyant sur une touche Retour ou Entrée? Dans le code Python, vous ne faites pas l'équivalent de cela.

+0

fabuleux, le fait le tour! J'avais essayé \ n plus tôt (ne travaillait pas) mais je n'étais pas au courant de \ r. la chasse d'eau n'était pas nécessaire non plus. Merci! – mix

+1

avéré j'avais besoin du \ r \ n, pas seulement. Cela fonctionne dans certains cas, mais pas dans tous, ce qui était déroutant. \ n par lui-même travaillé dans aucun. – mix

0

Vous devez flush le socket juste après le send, pour forcer la pile TCP à envoyer réellement les données. Sinon, il attendra plus de données à envoyer, afin de remplir un paquet efficacement. Pendant que vous attendez une réponse du serveur, rien n'a encore été envoyé.

+0

J'ai essayé un flush() sur la version de l'objet fichier, sans changement de comportement. Il ne semble pas y avoir de méthode flush() pour socket qui fonctionne avec socket.write (?). – mix

Questions connexes