python xmlrpc.client.ServerProxy - 如何指定本地端口范围

3 投票
2 回答
1636 浏览
提问于 2025-04-17 20:57

有没有简单的方法来指定xml-rpc客户端连接应该使用的源端口范围?

假设在客户端和xml-rpc服务器之间有一个防火墙,它只允许特定的连接(通过IP和端口范围)访问服务器。

默认情况下,xmlrpc.client.ServerProxy让操作系统来决定使用哪个本地端口。因此,每次xml-rpc调用都会从自己的端口打开一个连接到服务器,而这个端口会保持在TIME_WAIT状态,直到超时结束。在Windows系统中,使用netstat -b可以看到这样的连接:

C:\tmp>netstat -b | grep 51000
  TCP    ZIBI:51000             localhost:1552         TIME_WAIT    0
  TCP    ZIBI:51000             localhost:1562         TIME_WAIT    0
  TCP    ZIBI:51000             localhost:1561         TIME_WAIT    0
  TCP    ZIBI:51000             localhost:1553         TIME_WAIT    0
  TCP    ZIBI:51000             localhost:1559         TIME_WAIT    0
  TCP    ZIBI:51000             localhost:1558         TIME_WAIT    0
  TCP    ZIBI:51000             localhost:1557         TIME_WAIT    0

我想要实现的是可以配置的端口范围(例如上面提到的15XX),让xmlrpc.client.ServerProxy在调用服务器的rpc方法时使用这个范围的端口。

2 个回答

0

在通过ServerProxy调用获取数据后:

cli = xmlrpclib.ServerProxy(..)

接下来是

<httplib.py>

class HTTPConnection:

  _http_vsn = 11
  _http_vsn_str = 'HTTP/1.1'

  response_class = HTTPResponse
  default_port = HTTP_PORT
  auto_open = 1
  debuglevel = 0
  strict = 0

  def __init__(self, host, port=None, strict=None,
             timeout=socket._GLOBAL_DEFAULT_TIMEOUT, source_address=None):

我发现了source_address这个参数,它用来指定我想要的内容。接着我在Stack Overflow上搜索source_address,找到了一个讨论:Python:是否可以使用xmlrpclib设置客户端端口? 这个讨论定义了一个自定义的传输方式,可以指定源地址,基本上回答了我的问题;至少这是实现端口范围的一个不错的起点。

2

: 是用来分隔主机和端口的符号。

netstat -a | grep :15* 

撰写回答