0

我觉得这是一个非常基本的问题,但我的 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环境中改变了什么,这将允许我传递一个字符串。

4

1 回答 1

1

它按预期工作(程序不做我们想要的,他们做我们告诉他们做的)。如果您的问题是如何让 windows XP telnet 发送 CRLF,您可以设置相应的选项:

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

但我认为你应该重新考虑你的代码,因为服务器不会读取一行,它会尝试读取 1024 个字节。

很有帮助。

于 2010-11-19T13:47:14.150 回答