Python中TCP服务器程序关闭后端口占用问题

当Pythonsocket程序关闭后,端口可能仍被占用导致无法再次绑定。通过设置SO_REUSEADDR选项,允许在同一端口上重新绑定,解决了OSError:[WinError10048]的错误。然而,这并不关闭原来的进程,可能需要手动通过任务管理器结束python.exe进程。
摘要由CSDN通过智能技术生成

问题

from socket import *
serverPort=12000
serverSocket=socket(AF_INET,SOCK_STREAM)
#serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
serverSocket.bind(('',serverPort))
serverSocket.listen(1)
print("The server is ready to receive")
while True:
    connectionSocket,addr=serverSocket.accept()
    sentence=connectionSocket.recv(1024).decode()
    capitalizedSentence=sentence.upper()
    connectionSocket.send(capitalizedSentence.encode())
    connectionSocket.close()

运行再关闭该程序后,端口12000仍然被占用(如下图)

再次运行该程序,会报错:OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

解决

一种解决方法

加入serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

from socket import *
serverPort=12000
serverSocket=socket(AF_INET,SOCK_STREAM)
#serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
serverSocket.bind(('',serverPort))
serverSocket.listen(1)
print("The server is ready to receive")
while True:
    connectionSocket,addr=serverSocket.accept()
    sentence=connectionSocket.recv(1024).decode()
    capitalizedSentence=sentence.upper()
    connectionSocket.send(capitalizedSentence.encode())
    connectionSocket.close()

该方法的不足之处

可以再运行该程序,但原先的进程并未被关闭

通过任务管理器查看,发现在跑的进程是python.exe

以为pycharm关掉程序以后,进程不会关闭,结果试了其他py程序,关了以后进程都是一起关掉的,网上搜都说是TIME_WAIT状态,可是我服务器没有客户端连接过,应该没产生TCP连接,也就不会进入TIME_WAIT状态

目前找到的解决这个不足的办法只有命令行关闭进程了

 

setsockopt方法中的SO_REUSEADDR选项

缺省条件下,一个套接口不能与一个已在使用中的本地地址捆绑。但有时会需要“重用”地址。因为每一个连接都由本地地址和远端地址的组合唯一确定,所以只要远端地址不同,两个套接口与一个地址捆绑并无大碍。为了通知Windows套接口实现不要因为一个地址已被一个套接口使用就不让它与另一个套接口捆绑,应用程序可在bind()调用前先设置SO_REUSEADDR选项。请注意仅在bind()调用时该选项才被解释;故此无需(但也无害)将一个不会共用地址的套接口设置该选项,或者在bind()对这个或其他套接口无影响情况下设置或清除这一选项。(from 百度百科)

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值