使用 Python 请求时如何获取底层套接字

Posted

技术标签:

【中文标题】使用 Python 请求时如何获取底层套接字【英文标题】:How to get the underlying socket when using Python requests 【发布时间】:2015-11-25 11:17:38 【问题描述】:

我有一个 Python 脚本,它使用 requests 库创建许多短期的同时连接。我特别需要找出每个连接使用的源端口,我认为我需要为此访问底层套接字。有没有办法通过响应对象得到这个?

【问题讨论】:

另一种方法是在 Windows 中 netstat -a 可以列出所有进程以及所使用的端口。您可以编写一个 python 脚本来获取此命令的输出,然后进行进一步的工作。没那么难。不确定requests lib 是否可以做到这一点。 我的程序中有很多短暂的同时连接。没有办法知道哪个端口属于哪个连接。 您可以检索应用程序使用的所有端口,但不能使用任何内置命令 (Windows) 来查找应用程序的哪个连接正在使用哪个端口号。我建议在 Superuser.com 中询问 【参考方案1】:

对于流连接(使用stream=True 参数打开的连接),您可以在响应对象上调用.raw.fileno() 方法来获取打开的文件描述符。

您可以使用socket.fromfd(...) 方法从描述符创建 Python 套接字对象:

>>> import requests
>>> import socket
>>> r = requests.get('http://google.com/', stream=True)
>>> s = socket.fromfd(r.raw.fileno(), socket.AF_INET, socket.SOCK_STREAM)
>>> s.getpeername()
('74.125.226.49', 80)
>>> s.getsockname()
('192.168.1.60', 41323)

对于非流式套接字,文件描述符在返回响应对象之前被清除。据我所知,在这种情况下无法获得它。

【讨论】:

这很好用。我发现如果我在“响应”回调中使用你的方法,即使是非流式请求,我也可以做到这一点。

以上是关于使用 Python 请求时如何获取底层套接字的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python Twitch IRC Bot 获取聊天消息参数?

Angular2 - 如何关闭 WebSocketSubject 底层套接字

如何在接收响应时通过 websocket 发送请求

ZeroMQ:如何获取连接客户端的地址?

如何从服务器发送请求断开连接到所有客户端和服务器仍然存在(python套接字)

如何修复套接字 io 中的 400 错误错误请求?