2010-11-19 126 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

相关问题