2016-03-13 11 views
1

Я после Twisted tutorial и попытался следующий код из этой статьи:Почему работа telnet и netcat терпят неудачу с этим примером Twisted?

# Read username, output from non-empty factory, drop connections 

from twisted.internet import protocol, reactor 
from twisted.protocols import basic 

class FingerProtocol(basic.LineReceiver): 
    def lineReceived(self, user): 
     self.transport.write(self.factory.getUser(user)+"\r\n") 
     self.transport.loseConnection() 

class FingerFactory(protocol.ServerFactory): 
    protocol = FingerProtocol 

    def __init__(self, **kwargs): 
     self.users = kwargs 

    def getUser(self, user): 
     return self.users.get(user, "No such user") 

reactor.listenTCP(1079, FingerFactory(moshez='Happy and well')) 
reactor.run() 

Я попытался nc localhost 1079, и он просто не висит: нет ответов. Но тогда telnet localhost 1079 работает просто отлично. Зачем?

ответ

3

Используя wirehark, я выяснил следующее: telnet отправлял 0x0d, а затем 0x0a (т. Е. «\ R \ n») для терминатора линии. Однако netcat отправлял только 0x0a. Это было на Ubuntu (а также на OS X).

По-видимому, протокол LineReceiver в Twisted требует \ r для того, чтобы поднять событие, полученное «line received».

Существует не менее 6 версий netcat, но на OS X (который находится рядом с FreeBSD) есть опция -c, которая добавляет \ r \ n в конец каждой строки. Использование этой опции устраняет проблему.

$ nc -c localhost 1079 
moshez 
Happy and well 

Примечание: LineReceiver имеет переменную класса с именем delimiter, что позволяет любому EOL символ, который будет использоваться. Установка delimiter = '\n' устраняет необходимость использования -c для netcat.

+0

Это 100% правильный ответ, поэтому вы должны принять свой собственный ответ :) – Glyph

+0

На сайте требуется, чтобы я подождал 2 дня, прежде чем я смогу это сделать. :) – Fixee

1

В Linux, вам нужно использовать CRLF в качестве EOL

С нанокристаллов страницы человека:

-C, --crlf (Использование CRLF в качестве EOL). Этот параметр указывает Ncat преобразовать LF. конец строки в CRLF. при вводе ввода со стандартного ввода. Это полезно для общения с некоторыми строгими серверами непосредственно с терминала в одном из многих распространенных текстовых протоколов, которые используют CRLF для конца строки.