重复的POST请求导致错误"socket.error:(99,'无法分配请求的地址')"

BiG*_*YaN 2 python network-programming

我在我的盒子里部署了一个Web服务.我想用各种输入检查这项服务的结果.这是我正在使用的代码:

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()
Run Code Online (Sandbox Code Playgroud)

打印相同行数后,此代码出错(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')
Run Code Online (Sandbox Code Playgroud)

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

BiG*_*YaN 9

这不是一个python问题.

在linux内核2.4中,短暂的端口范围是从32768到61000.因此可用端口的数量= 61000-32768 + 1 = 28233.据我所知,因为所讨论的Web服务非常快(实际上<5ms)因此所有端口用完了.程序必须等待大约一两分钟才能关闭端口.

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


小智 5

BIGYaN正确识别了问题,您可以在异常发生后立即调用"netstat -tn"来验证.您将看到很多与状态"TIME_WAIT"的连接.

等待端口号再次可用的替代方法是仅对所有请求使用一个连接.conn.close()每次通话后都不需要打电话conn.request().您可以简单地保持连接处于打开状态,直到完成请求为止.