开发者社区> 问答> 正文

socket.error: [Errno 98] Address already?400报错

socket.error: [Errno 98] Address already in use? 400 报错

为什么有时候

>>>python manage.py runserver

会出错呢?错误信息是:

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


我关掉终端重新运行就正常了

展开
收起
爱吃鱼的程序员 2020-06-03 17:09:58 805 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    没玩过Python 看看端口的分配 因为套接字是基于网卡的 内存分配port是随机和指定的 我猜的 别当真

    ######哈哈。还是多谢你######这是因为在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))  





    ######不明觉厉,多谢
    2020-06-03 20:43:54
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载