问题
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 百度百科)