我觉得这是一个非常基本的问题,但我的 google-fu 没有产生任何特定的命中。我的问题与 windows 和 unix tcp 客户端之间的套接字通信差异有关。如果我在下面提供非常基本的 tcp 服务器代码,并通过 bsd/macos/linux 通过 telnet 或 netcat(例如 telnet remotehost 9997)建立连接,我可以输入一行文本,然后输入一个换行符( \r\n),然后服务器响应。
当我通过 telnet 应用程序(或使用 telnet 的 putty)从 Windows XP 客户端建立连接时,我能够连接,但在服务返回响应之前只能键入一个字符。我意识到 windows 与 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) 是我在尝试键入时键入的字符:blah
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 E..5w.@. <..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 E..5..@. @.^.....
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 remotehost 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 E..7..@. <......)
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环境中改变了什么,这将允许我传递一个字符串。