python - Python客户端代码获取地址已在使用中错误

标签 python sockets http client-server bind

我有一个简单的Python HTTP服务器,该服务器还连接其他HTTP服务器以获取一些数据。在连接到其他服务器时,我的服务器充当http客户端,但是为传入连接请求创建的套接字仍继续从端口8080监听(我为该客户端使用另一个套接字)。

我需要连接和获取数据的其他服务器的列表存储在JSON文件中,并且我有类似这样的代码

with open(myjsonfile, 'r') as json_file:
    entries = json.load(json_file)
    for entry in entries.keys():
        address = entries[entry]['address'] 
        port = int(entries[entry]['port'])
        client_port = config.server_port + 50000
        host = gethostname()

        # request the TXT file
        sock = socket(AF_INET,SOCK_STREAM)
        # sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        sock.bind((host, client_port))
        sock.connect((address, port))
        reqmsg = "GET /" + config.txt_name + " HTTP/1.0\r\n\r\n"
        sock.sendall(reqmsg.encode())
        response = ''
        response = sock.recv(2048).decode()
        pos = response.find("\r\n\r\n")
        txt_data = response[pos+4:]
        # processing the received data here
        sock.close()

        # request the IMG file
        sock = socket(AF_INET,SOCK_STREAM)
        # sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        sock.bind((host, client_port))
        sock.connect((address, port))
        reqmsg = "GET /" + config.img_name + " HTTP/1.0\r\n\r\n"
        sock.sendall(reqmsg.encode())
        response = b''
        while True:
            recvdata = sock.recv(2048)
            if (len(recvdata) < 1): 
                break
            response = response + recvdata
        pos = response.find(b"\r\n\r\n")
        img_data = response[pos+4:]
        # working with the image here
        sock.close()

我必须为客户端使用设置的端口号,因为这是服务器识别我的方式。但是,有时我在第二个socket.bind()调用(用于图像的调用)中收到“地址已在使用中”错误。没有bind()调用,我的代码可以正常工作。
我尝试设置套接字选项(在上面的代码中作了注释),并使用pycurl将LOCALPORT属性设置为上面的client_port值,但仍然遇到相同的错误。

错误消息背后的原因可能是什么?我想我打开和关闭 socket ,以便操作系统释放该端口以备将来使用(我认为)?

谢谢

PS:这是一个小项目,而不是生产系统,因此不必理会“为什么使用端口号标识客户端”

最佳答案

session 关闭后有一个TIME_WAIT以确保网络中仍然没有实时数据包。当您重新创建相同的元组并且其中一个数据包显示时,它将被视为连接的有效数据包。这将导致错误状态。通常2xpacket max age,在丢弃数据包之前

在使用相同的元组创建连接之前,来自上一个 session 的所有数据包都必须是无效的。

尝试使用;

...
sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
sock.listen([backlog])
sock.bind((host, client_port))
...

socket.listen([backlog])

关于python - Python客户端代码获取地址已在使用中错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61270009/

相关文章:

java - 无法从java中的流中读取

c++ - 套接字描述符在分配后关闭

http - 转到 : add logging to each router

c# - 是否有任何使用 TCP 套接字从中收集数据来读取 http 请求的示例(例如以某种方式模拟 Http 服务器)

ruby-on-rails - Rails 的页面缓存与 HTTP 反向代理缓存

python - 与 IPython 魔法函数调用 %matplotlib inline 等价的纯 Python 是什么?

python - 列出编辑距离矩阵中的非对角值

python - 属性错误: 'int' object has no attribute 'get'

python - Pandas to_csv(sys.stdout) 在我的环境下不起作用

c++ - 增加特定套接字的 TCP 接收窗口