python進(jìn)程結(jié)束后端口占用問題解析
socket分配
一個(gè)服務(wù)端進(jìn)程向操作系統(tǒng)申請一個(gè) scoket
來監(jiān)聽,但是當(dāng)進(jìn)程退出后,還未關(guān)閉的連接不會(huì)立即消失,而是會(huì)留給操作系統(tǒng)處理。操作系統(tǒng)會(huì)嘗試關(guān)閉這個(gè)連接。但是如果關(guān)閉時(shí)出現(xiàn)問題,這個(gè)連接就會(huì)一直處于 TIME_WAIT
或其他非正常狀態(tài),而這是相應(yīng)的端口還處于占用狀態(tài),如果這個(gè)時(shí)候再重新啟動(dòng)這個(gè)服務(wù)端程序,就會(huì)出現(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ù)端會(huì)打印 client
和 addr
,然后正常退出,但是此時(shí)使用 netstat -anop | grep 12345
查看,發(fā)現(xiàn)對(duì)應(yīng)連接并沒有被立即釋放
tcp 0 0 127.0.0.1:12345 127.0.0.1:59408 TIME_WAIT - timewait (28.18/0/0)
此時(shí)再次啟動(dòng)服務(wù)端,發(fā)現(xiàn)報(bào)錯(cuò)了:
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)
此時(shí)就不會(huì)出現(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
之外還有一個(gè)SO_REUSEPORT
的選項(xiàng),查詢后得知是BSD
獨(dú)有的,Linux
并不能用 - 如果是客戶端綁定端口用這個(gè)屬性可能會(huì)出現(xiàn)剛連接上服務(wù)器就莫名其妙收到一個(gè)
FIN
的問題,導(dǎo)致其立即關(guān)閉,因此客戶端使用此選項(xiàng)時(shí)需注意
參考鏈接
以上就是python進(jìn)程結(jié)束后端口占用問題解析的詳細(xì)內(nèi)容,更多關(guān)于進(jìn)程結(jié)束后端口占用問題的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python 使用xlwt模塊將多行多列數(shù)據(jù)循環(huán)寫入excel文檔的操作
這篇文章主要介紹了Python 使用xlwt模塊將多行多列數(shù)據(jù)循環(huán)寫入excel文檔的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11python 使用Yolact訓(xùn)練自己的數(shù)據(jù)集
這篇文章主要介紹了python 使用Yolact訓(xùn)練自己的數(shù)據(jù)集,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04python正則實(shí)現(xiàn)計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了python正則實(shí)現(xiàn)計(jì)算器功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12python 2.6.6升級(jí)到python 2.7.x版本的方法
這篇文章主要介紹了python 2.6.6升級(jí)到python 2.7.x版本的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10pandas的連接函數(shù)concat()函數(shù)的具體使用方法
這篇文章主要介紹了pandas的連接函數(shù)concat()函數(shù)的具體使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python高級(jí)特性之切片迭代列表生成式及生成器詳解
這篇文章主要為大家介紹了Python高級(jí)特性之切片迭代列表生成式及生成器詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-10-10Python調(diào)用百度AI實(shí)現(xiàn)身份證識(shí)別
這篇文章主要介紹了Python通過調(diào)用百度AI的文字識(shí)別功能實(shí)現(xiàn)對(duì)身份證進(jìn)行識(shí)別,代碼具有一定的學(xué)習(xí)價(jià)值,感興趣的朋友一起來看看效果吧2021-12-12