2016-03-13 23 views
1

我跟隨Twisted tutorial和那篇文章嘗試下面的代碼:爲什麼在這個Twisted示例中telnet工作和netcat失敗?

# 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

使用wireshark,我想出了以下內容:telnet發送0x0d,然後0x0a(即「\ r \ n」)爲行終止符。但netcat只發送0x0a。這是在Ubuntu上(也在OS X上)。

Twisted中的LineReceiver協議顯然需要\ r以提升「接收到的行」事件。

有很多netcat那裏至少6個版本,但在OS X上的一個(這是接近的FreeBSD)具有-c選項追加\ r \ n至每一行的末尾。使用此選項可修復問題。

$ nc -c localhost 1079 
moshez 
Happy and well 

注:LineReceiver有一個名爲delimiter類變量,允許使用任何EOL字符。設置delimiter = '\n'可以避免使用netcat的-c選項。

+0

這是100%正確的答案,所以你應該接受你自己的答案:) – Glyph

+0

該網站要求我等兩天才能這樣做。 :) – Fixee

1

在Linux上,你需要使用CRLF作爲EOL

從NC手冊頁:

-C,--crlf(使用CRLF的EOL)。 該選項告訴Ncat轉換LF。行結束CRLF。當從標準輸入中接受輸入時。這對於直接從使用CRLF作爲行尾的許多普通純文本協議之一中的終端與某些嚴格服務器交談來說很有用。