【问题标题】:Repeated POST request is causing error "socket.error: (99, 'Cannot assign requested address')"重复的 POST 请求导致错误“socket.error: (99, 'Cannot assign requested address')”
【发布时间】:2018-04-10 12:08:59
【问题描述】:

我的盒子里部署了一个网络服务。我想通过各种输入检查此服务的结果。这是我正在使用的代码:

import sys
import httplib
import urllib

apUrl = "someUrl:somePort"

fileName = sys.argv[1]
conn = httplib.HTTPConnection(apUrl)

titlesFile = open(fileName, 'r')

try:
    for title in titlesFile:

        title = title.strip()
        params = urllib.urlencode({'search': 'abcd', 'text': title})
        conn.request("POST", "/somePath/", params)
        response = conn.getresponse()
        data = response.read().strip()
        print data+"\t"+title

        conn.close()

finally:
    titlesFile.close()

此代码在打印相同数量的行后出现错误 (28233)。错误信息:

Traceback (most recent call last):
  File "testService.py", line 19, in ?
    conn.request("POST", "/somePath/", params)
  File "/usr/lib/python2.4/httplib.py", line 810, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python2.4/httplib.py", line 833, in _send_request
    self.endheaders()
  File "/usr/lib/python2.4/httplib.py", line 804, in endheaders
    self._send_output()
  File "/usr/lib/python2.4/httplib.py", line 685, in _send_output
    self.send(msg)
  File "/usr/lib/python2.4/httplib.py", line 652, in send
    self.connect()
  File "/usr/lib/python2.4/httplib.py", line 636, in connect
    raise socket.error, msg
socket.error: (99, 'Cannot assign requested address')

我正在使用 Python 2.4.3。我也在做conn.close()。但是为什么会出现这个错误呢?

【问题讨论】:

标签: python network-programming


【解决方案1】:

这不是 python 问题。

在 linux 内核 2.4 中,临时端口范围是从 32768 到 61000。所以可用端口的数量 = 61000-32768+1 = 28233。据我了解,因为所讨论的 Web 服务非常快(实际上

我所做的是计算conn.close() 的数量。当数字为 28000 时,等待 90 秒并重置计数器。

【讨论】:

    【解决方案2】:

    BIGYaN 正确识别了问题,您可以在异常发生后立即调用“netstat -tn”来验证这一点。您会看到很多状态为“TIME_WAIT”的连接。

    等待端口号再次可用的替代方法是简单地为所有请求使用一个连接。您无需在每次拨打conn.request() 后拨打conn.close()。您可以简单地保持连接打开,直到您完成您的请求。

    【讨论】:

      【解决方案3】:

      在 Spark 中使用 python 的请求库执行多个 POST 语句时,我也遇到了类似的问题。更糟糕的是,我在每个执行程序上使用多处理来发布到服务器。因此,在几秒钟内创建了数千个连接,每个连接都需要几秒钟才能从 TIME_WAIT 更改状态并为下一组连接释放端口。

      在互联网上所有可用的解决方案中,使用 request.Session() 等来禁用保持活动,我发现 this 使用 'Connection' 的答案正在工作: 'close' 配置为头参数。不过,您可能需要将标题内容放在 post 命令之外的单独行中。

      headers = {
              'Connection': 'close'
      }
      with requests.Session() as session:
      response = session.post('https://xx.xxx.xxx.x/xxxxxx/x', headers=headers, files=files, verify=False)
      results = response.json()
      print results
      

      This 是我使用上述解决方案对类似问题的回答。

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
      • 知道了,乔纳森。相应地改变了答案。感谢您的意见。
      猜你喜欢
      • 2013-12-26
      • 2014-04-14
      • 1970-01-01
      • 2021-06-02
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      相关资源
      最近更新 更多