一个 Python socket 中的超时错误(有 wireshark 截图)

2019-10-29 22:35:55 +08:00
 among

现在写一个 python 的模拟请求客户端,原先有个其他人提供的 java 程序。这个 java 发送正常,可以成功收到响应。 使用 python socket 进行模拟,每次都是超时,接收不到任何数据,使用了多种方式仍然不行,使用 charles 做 端口转发,java 的也会失败,最后使用 wireshark 抓包。

19.53 是客户端,6.60 是服务器端。

图中,前面一个是 java 正常发送接收的例子,比较奇怪的是发出报文体( No193 ),接着 194 就发出了 “FIN ACK”。

从 No 1284 开始的是 python 请求,在发出报文体( No 1287 )后,服务器直接反馈了一个 ACK,并没有发出响应报文,后续进入超时等待的时间,直到 python 端发出 socket close ( No 1724 ),服务端才响应报文( No 1725 ),这个时候请求端已经关闭连接了,什么都没收到。

代码如下:

 		try:
            self.sok.connect((ip, int(port)))
            self.sok.send(msg)
            self.sok.settimeout(int(timeout))
            rsp = self.sok.recv(1024)
            self.sok.close()
        except Exception as ex:
            print('socket_send: %s:%d ,error: %s' %
                  (ip, int(port), traceback.format_exc()))
            rsp = b''
 ........

还使用了

        try:
            self.sok.connect((ip, int(port)))
            self.sok.send(msg)
            self.sok.settimeout(int(timeout))
            while True:
                data = self.sok.recv(1024)
                print(data)
                if not data:
                    break
                total_data.append(data)

这几个都是一样的错误,现在很奇怪,为什么 java 的可以成功,python 的接收不到报文。 请大家帮忙看下。

2779 次点击
所在节点    Python
7 条回复
ysc3839
2019-10-29 23:02:44 +08:00
反编译 Java 程序看看?
lcdtyph
2019-10-29 23:05:26 +08:00
你的 py 版本发送的内容不全,或者格式错了,导致服务端一直在等待后续内容从而超时了。

你需要对比的是两个版本 tcp payload 的内容,从图里看,java 版发送了 174 字节,而 py 版只发送了 155 字节
superrichman
2019-10-29 23:23:07 +08:00
socket 初始化参数?
ysc3839
2019-10-29 23:39:04 +08:00
或者试一下 send 之后调用一下 socket.shutdown(SHUT_WR) ?
sunnyadamm
2019-10-29 23:40:31 +08:00
2l 正解,你两个包大小不一致,看看你的 py 发送少了啥吧
among
2019-10-30 09:46:46 +08:00
@sunnyadamm
@lcdtyph

数据包的内容是一致的。

![截图]( https://imamong.github.io/media/15723578856199/15723995295101.jpg)

响应的大小也是一样,不是发送内容的问题。
among
2019-10-30 09:55:21 +08:00
```python
self.sok.shutdown(socket.SHUT_WR)
``

增加了主动关闭发送的设置,现在可以正常接收响应了,问题解决。
谢谢,@ysc3839

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/614236

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX