• 技术文章 >后端开发 >Python教程

    Python socket.error: [Errno 98] Address already in use的原因和解决

    2016-06-06 11:32:42原创2235
    一、原因浅析

    今天在写一个Python与html5 Websocket 实例,么次终止运行重新运行脚本总是提示地址已经存在并且被使用!查询相关文档才知道在socket编程中,当通过客户端向服务器端发送消息,关闭了连接后,这时如果马上再去运行服务器端程序,会提示这个错误:

    代码如下:


    socket.error: [Errno 98] Address already in use


    这是因为在TCP/IP终止连接的四次握手中,当最后的ACK回复发出后,有个2MSL的时间等待,MSL指一个片段在网络中最大的存活时间,这个时间一般是30秒,所以基本上过60秒后就可以重新连接!
    为什么要等待2MSL?是因为在最后发出ACK回复后,发送方不能确认ACK是否被另一端正常收到,如果另一端没有收到ACK回复的话,将会在1MSL后再次发送FIN片段。所以说发送方等待2MSL时间,也就是刚好它发ACK回复和对方发送FIN片段的时间,如果此时间内都没有再次收到FIN片段的话,发送方就假设对方已经正常接收到了ACK回复,此时它就会正常关闭连接!

    二、解决方法

    如果python中socket 绑定的地址正在使用,往往会出现错误,

    在linux下:

    代码如下:


    则会显示“ socket.error: [Errno 98] Address already in use”


    在windows下:

    代码如下:


    则会显示 “socket.error: [Errno 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次”


    这是因为socket默认不支持地址复用,如果要复用需要显示设定,即在绑定前调用setsockop函数t让套接字允许地址重用:socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

    例如:

    代码如下:


    self.recSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    self.recSocket.settimeout(CHECK_TIMEOUT)
    self.recSocket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    self.recSocket.bind(('', UDP_PORT))

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Python socket.error: [Errno 98
    上一篇:Python中的startswith和endswith函数使用实例 下一篇:Python对小数进行除法运算的正确方法示例
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 总结分享Python冷门的技巧• python虚拟环境配置与管理• 聊聊Python中列表和字典前加星号(**)• 一文搞懂Python爬虫解析器BeautifulSoup4• Python怎么利用contextvars实现管理上下文变量
    1/1

    PHP中文网