2010-11-19 134 views
0

我覺得這是一個非常基本的問題,但是我的google-fu沒有產生任何特定的點擊。我的問題與windows和unix tcp客戶端之間的套接字通信差異有關。如果我提供了下面非常基本的tcp服務器代碼,並通過telnet或netcat通過bsd/macos/linux建立連接(例如telnet remotehost 9997),我可以輸入一行文本,然後輸入一個新行( \ r \ n),服務器響應。python tcp socketserver和windows和unix客戶端之間的區別

當我通過telnet應用程序(或putty使用telnet)建立從Windows XP客戶端的連接時,我能夠連接,但只能在服務返回響應之前鍵入單個字符。我意識到windows vs unix網絡堆棧不同地處理套接字,但奇怪的是,從我的數據包捕獲,我沒有看到Windows客戶端添加回車。

示例代碼:

import SocketServer as socketserver 

class MyTCPHandler(socketserver.BaseRequestHandler): 

    def handle(self): 
     self.request.send("Welcome\r\n") 
     self.data = self.request.recv(1024).strip() 
     print("%s wrote:" % self.client_address[0]) 
     print(self.data) 
     self.request.send(self.data.upper()) 

if __name__ == "__main__": 

    server = socketserver.TCPServer(('', 9997), MyTCPHandler) 
    server.serve_forever() 

這裏是關於服務器側的數據包捕獲從Windows客戶機連接時。 0X62(b)是我輸入的字符,我試圖鍵入時:胡說

0000 00 00 00 01 00 06 00 23 33 74 d5 3f 00 00 08 00 .......# 3t.?.... 
0010 45 00 00 35 77 86 40 00 3c 06 02 5a 0a 0e 14 29 [email protected] <..Z...) 
0020 0a 03 9c a9 c6 0e 27 0d 20 ed 36 de 87 f2 30 a2 ......'. .6...0. 
0030 80 18 ff ff 48 ee 00 00 01 01 08 0a 08 00 46 01 ....H... ......F. 
0040 94 f6 26 6f 62          ..&ob 

服務器響應用的0x42(B)

0000 00 04 00 01 00 06 00 50 56 86 1a 4e 00 00 08 00 .......P V..N.... 
0010 45 00 00 35 16 fd 40 00 40 06 5e e3 0a 03 9c a9 [email protected] @.^..... 
0020 0a 0e 14 29 27 0d c6 0e 87 f2 30 a2 20 ed 36 df ...)'... ..0. .6. 
0030 80 18 00 b5 c5 0a 00 00 01 01 08 0a 94 f6 29 a0 ........ ......). 
0040 08 00 46 01 42          ..F.B 

這裏是從UNIX客戶端的數據包轉儲(netcat的遠程主機9997),我輸入了字母t(0x74),並且需要強制命中產生0x0d0a的回車符。

0000 00 00 00 01 00 06 00 23 33 74 d5 3f 00 00 08 00 .......# 3t.?.... 
0010 45 00 00 37 ee d2 40 00 3c 06 8b 0b 0a 0e 14 29 [email protected] <......) 
0020 0a 03 9c a9 c6 10 27 0d 69 ac 8e d6 b8 7b 92 b4 ......'. i....{.. 
0030 80 18 ff ff c4 b1 00 00 01 01 08 0a 08 00 48 1d ........ ......H. 
0040 94 f6 59 2b 74 0d 0a        ..Y+t.. 

所以我的問題是,我怎麼能得到這個套接字服務器與Windows客戶端一起工作?或者我在Windows環境中更改什麼,這將允許我傳遞一串字符。

+0

我認爲我發佈後不久就意識到我的問題。 windows telnet客戶端不是真正的原始套接字客戶端(ala netcat)。使用膩子和指定「原始」連接類型選項執行預期 – 2010-11-19 13:48:43

回答

1

它按預期工作(程序不做我們想要的,他們做我們告訴他們做的事情)。如果你的問題是如何讓Windows XP遠程登錄發送CRLF,可以設置相應的選項:

telnet 
set ? 
set crlf 
open <host> <port> 

但我認爲你應該重新考慮你的代碼,因爲服務器不能讀取一條線,它會嘗試讀取1024個字節。

This很有幫助。

+1

謝謝。這是我的代名詞混淆,並假設Windows Telnet客戶端是一個原始套接字客戶端。 – 2010-11-19 23:02:48

相關問題