python進(jìn)程結(jié)束后端口占用問題解析
socket分配
一個服務(wù)端進(jìn)程向操作系統(tǒng)申請一個 scoket 來監(jiān)聽,但是當(dāng)進(jìn)程退出后,還未關(guān)閉的連接不會立即消失,而是會留給操作系統(tǒng)處理。操作系統(tǒng)會嘗試關(guān)閉這個連接。但是如果關(guān)閉時出現(xiàn)問題,這個連接就會一直處于 TIME_WAIT 或其他非正常狀態(tài),而這是相應(yīng)的端口還處于占用狀態(tài),如果這個時候再重新啟動這個服務(wù)端程序,就會出現(xiàn)地址被占用的情況
例子
測試代碼:
import socket
s = socket.socket()
s.bind(('0.0.0.0', 12345))
s.listen()
(client, addr) = s.accept()
print(client)
print(addr)
使用 nc 進(jìn)行連接:
nc 127.0.0.1 12345
服務(wù)端會打印 client 和 addr ,然后正常退出,但是此時使用 netstat -anop | grep 12345 查看,發(fā)現(xiàn)對應(yīng)連接并沒有被立即釋放
tcp 0 0 127.0.0.1:12345 127.0.0.1:59408 TIME_WAIT - timewait (28.18/0/0)
此時再次啟動服務(wù)端,發(fā)現(xiàn)報錯了:
Traceback (most recent call last):
File "server.py", line 5, in <module>
s.bind(('0.0.0.0', 12345))
OSError: [Errno 98] Address already in use
解決方案
使用 setsockopt :
import socket
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('0.0.0.0', 12345))
s.listen()
(client, addr) = s.accept()
print(client)
print(addr)
此時就不會出現(xiàn)地址被占用的提示了
在 c 中也有一樣的方法,只是方法聲明不同, c 版的用法為
struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.s_addr = htonl(INADDR_ANY); int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); int reuse = 1; setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)); bind(s, (struct sockaddr *) &addr, sizeof(addr)) listen(s, ) struct sockaddr_in in_addr; int len = sizeof(in_addr); int client = accept(socket, (struct sockaddr *) in_addr, &len); //handle client //...
其他
- 發(fā)現(xiàn)除了
SO_REUSEADDR之外還有一個SO_REUSEPORT的選項,查詢后得知是BSD獨(dú)有的,Linux并不能用 - 如果是客戶端綁定端口用這個屬性可能會出現(xiàn)剛連接上服務(wù)器就莫名其妙收到一個
FIN的問題,導(dǎo)致其立即關(guān)閉,因此客戶端使用此選項時需注意
參考鏈接
以上就是python進(jìn)程結(jié)束后端口占用問題解析的詳細(xì)內(nèi)容,更多關(guān)于進(jìn)程結(jié)束后端口占用問題的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用matplotlib中scatter方法畫散點(diǎn)圖
這篇文章主要為大家詳細(xì)介紹了使用matplotlib中scatter方法畫散點(diǎn)圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-03-03
python爬取網(wǎng)頁轉(zhuǎn)換為PDF文件
這篇文章主要為大家詳細(xì)介紹了python爬取網(wǎng)頁轉(zhuǎn)換為PDF文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06
python anaconda 安裝 環(huán)境變量 升級 以及特殊庫安裝的方法
下面小編就為大家?guī)硪黄猵ython anaconda 安裝 環(huán)境變量 升級 以及特殊庫安裝的方法。2017-06-06

