Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python tcp socketserver以及windows和unix客户端之间的差异_Python_Tcp_Client_Socketserver - Fatal编程技术网

python tcp socketserver以及windows和unix客户端之间的差异

python tcp socketserver以及windows和unix客户端之间的差异,python,tcp,client,socketserver,Python,Tcp,Client,Socketserver,我觉得这是一个非常基本的问题,但我的谷歌fu并没有产生任何特定的点击率。我的问题与windows和unix tcp客户端之间的套接字通信差异有关。如果我提供下面非常基本的tcp服务器代码,并通过telnet或netcat(例如telnet remotehost 9997)通过bsd/macos/linux建立连接,我就能够输入一行文本,后跟一行新行(\r\n),服务器会响应 当我通过telnet应用程序(或putty使用telnet)从windows XP客户端建立连接时,我可以连接,但只能在服

我觉得这是一个非常基本的问题,但我的谷歌fu并没有产生任何特定的点击率。我的问题与windows和unix tcp客户端之间的套接字通信差异有关。如果我提供下面非常基本的tcp服务器代码,并通过telnet或netcat(例如telnet remotehost 9997)通过bsd/macos/linux建立连接,我就能够输入一行文本,后跟一行新行(\r\n),服务器会响应

当我通过telnet应用程序(或putty使用telnet)从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  
这是来自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..
0000 00 00 01 00 06 00 23 33 74 d5 3f 00 08 00。?。。。。
0010 45 00 37 ee d2 40 00 3c 06 8b 0b 0a 0e 14 29 E..7 它按预期工作(程序不做我们想做的,他们做我们告诉他们做的)。如果您的问题是如何使windows XP telnet发送CRLF,您可以设置适当的选项:

telnet
set ?
set crlf
open <host> <port>
telnet
设置
设置crlf
打开
但是我认为您应该重新考虑您的代码,因为服务器不读取一行,它尝试读取1024字节


很有帮助。

我想我在发布后不久就意识到了我的问题。windows telnet客户端不是真正的原始套接字客户端(ala netcat)。使用putty并指定“原始”连接类型选项的性能与预期的一致。这对我来说是一种困惑,并且假设windows telnet客户端是一个原始套接字客户端。
telnet
set ?
set crlf
open <host> <port>