Я пытаюсь записать простому основанному на сокете клиенту в 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
Первые 'ПРИВЕТ' выравнивают, то, что я ввел, второй является ответом.
Вам, вероятно, нужно завершить ваше сообщение
какими-то «символами конца строки» - возможно, \ r \ n
, возможно, одним из двух. Когда вы находитесь в Telnet, разве вы не завершали набранный текст нажатием клавиши Return или Enter? В коде Python вы этого не делаете.
Вам нужно очистить
сокет сразу после send
, чтобы заставить стек TCP отправлять данные. В противном случае он будет ждать отправки дополнительных данных, чтобы эффективно заполнить пакет. Пока вы ждете ответа от сервера, на самом деле еще ничего не было отправлено.