Сокетное соединение с основанным на telnet сервером зависает на чтении

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

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

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

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

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

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

Первые 'ПРИВЕТ' выравнивают, то, что я ввел, второй является ответом.

5
задан mix 23 May 2010 в 21:44
поделиться

2 ответа

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

7
ответ дан 14 December 2019 в 08:44
поделиться

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

0
ответ дан 14 December 2019 в 08:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: