Разъем подключения к серверу на основе telnet зависает при чтении - PullRequest
5 голосов
/ 24 мая 2010

Я пытаюсь написать простой клиент на основе сокетов в Python, который будет подключаться к серверу telnet. Я могу проверить сервер, подключившись к его порту (5007) и введя текст. Он отвечает NAK (ошибка) или AK (успех), иногда сопровождается другим текстом. Кажется очень простым.

Я написал клиент для подключения и связи с сервером, но он зависает при первой попытке прочитать ответ. Соединение установлено успешно. Запросы, такие как getsockname и getpeername, успешны. Команда send возвращает значение, равное количеству отправляемых символов, поэтому, похоже, оно отправляется правильно. Но в конце всегда зависает, когда пытаюсь прочитать ответ.

Я пытался использовать оба файловых объекта, таких как readline и write (через socket.makefile), а также send и recv. С помощью файлового объекта я попытался сделать это с помощью «rw» и прочитать и записать с помощью этого объекта, а затем попробовал один объект для «r» и другой для «w», чтобы отделить их. Ничто из этого не сработало.

Я использовал анализатор пакетов, чтобы посмотреть, что происходит. Я не разбираюсь во всем, что вижу, но во время сеанса telnet я вижу свой набранный текст и текст сервера, возвращающийся. Во время подключения к Python-сокету я вижу, как мой текст отправляется на сервер, но в пакетах назад, похоже, нет текста.

Любые идеи о том, что я делаю неправильно, или какие стратегии попробовать?

Вот код, который я использую (в данном случае это с send и 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)

О, если это полезно, вот пример сеанса telnet, выполняемого вручную:

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

Первая строка 'HELLO' - это то, что я напечатал, вторая - ответ.

Ответы [ 2 ]

7 голосов
/ 24 мая 2010

Возможно, вам нужно завершить ваш msg какими-то "символами конца строки" - возможно, \r\n, возможно, только одним из двух.Когда вы находитесь в telnet, вы не прерываете набранный текст, нажимая клавишу Return или Enter?В коде Python вы не делаете эквивалент этого.

0 голосов
/ 24 мая 2010

Вам нужно flush сокет сразу после send, чтобы стек TCP фактически отправлял данные.В противном случае он будет ожидать отправки большего количества данных, чтобы эффективно заполнить пакет.Пока вы ожидаете ответа от сервера, на самом деле ничего еще не было отправлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...