为什么telnet工作和netcat失败了这个Twisted示例?

时间:2016-03-13 06:11:09

标签: python twisted telnet netcat

我跟随Twisted tutorial并尝试了该文章中的以下代码:

ConvertTo-Csv

我试过了# 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就可以了。为什么呢?

2 个答案:

答案 0 :(得分:5)

使用wireshark,我想出了以下内容:telnet为行终止符发送0x0d然后0x0a(即“\ r \ n”)。但是netcat仅发送0x0a。这是在Ubuntu上(也在OS X上)。

显然,Twisted中的LineReceiver协议需要\ r才能引发“已接收线路”事件。

至少有6个netcat版本,但是OS X上的版本(接近FreeBSD)有一个-c选项,将\ r \ n附加到每个版本的末尾线。使用此选项可以解决问题。

$ nc -c localhost 1079 
moshez
Happy and well

注意:LineReceiver有一个名为delimiter的类变量,允许使用任何EOL字符。设置delimiter = '\n'不需要netcat的-c选项。

答案 1 :(得分:1)

在Linux上,您需要将CRLF用作EOL

来自nc手册页:

  

-C, - crlf(将CRLF用作EOL)。              此选项告诉Ncat转换LF。 CRLF的行结尾。当从标准输入中获取输入时。这对于直接从终端与一些严格的服务器通信是很有用的,这些服务器使用CRLF作为终端的许多常见纯文本协议之一。