Python telnetlib read_until спамит мой сервер

Я использую telnet lib для чтения с сервера Telnet.

мой код выглядит так:

 s = telnetlib.Telnet(self.host, self.port)
 while 1:
     line = s.read_until("\n")
     print(line)

пока это работает нормально, но когда я смотрю на сетевой трафик, я вижу тонны пакетов между клиентом и сервером. Если я использую необработанный сокет, этого не происходит.

пакеты в сети почти пустые. Я думаю, это тяга к следующему персонажу

Есть ли у кого-нибудь объяснение этому? Я не хочу спамить свой телнет-сервер, но мне нравится идея механизма read_until, так как я могу получать построчно.

Благодарность!


person Vinzens    schedule 09.04.2014    source источник


Ответы (2)


Похоже, ваш сервер Telnet работает в небуферизованном режиме (отправляет не всю строку, а каждый символ в отдельном пакете). Вероятно, вам нужно изменить настройки сервера, чтобы он мог работать в буферизованном режиме.

Также вы можете увидеть:

  • много пакетов от клиента telnet обратно на сервер. Это эхо всех команд, и это вполне нормально
  • Небольшие пакеты с новыми строковыми символами, такими как \n\n\r

ИЗМЕНИТЬ:

Другой возможной причиной является опрос, вы можете попробовать это:

import sys
import select
del select.poll
import telnetlib

tn = telnetlib.Telnet('10.32.137.39', 3008)

while 1:
    line = s.read_until("\n")
    print(line)

Чтобы сказать что-то более конкретное, было бы здорово увидеть трассировку трафика Wireshark.

person Konstantin    schedule 10.04.2014
comment
Решил это, используя: ‹pre› import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((self.host, self.port)) for i in s.makefile('r'): print(FOO + i) ‹/pre› - person Vinzens; 14.04.2014

Решил это с помощью:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((self.host, self.port))
for i in s.makefile('r'):
    print("FOO " + i)
person Vinzens    schedule 14.04.2014