您好,登錄后才能下訂單哦!
本篇內容主要講解“python進程結束后端口被占用怎么解決”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“python進程結束后端口被占用怎么解決”吧!
一個服務端進程向操作系統申請一個 scoket
來監聽,但是當進程退出后,還未關閉的連接不會立即消失,而是會留給操作系統處理。操作系統會嘗試關閉這個連接。但是如果關閉時出現問題,這個連接就會一直處于 TIME_WAIT
或其他非正常狀態,而這是相應的端口還處于占用狀態,如果這個時候再重新啟動這個服務端程序,就會出現地址被占用的情況
測試代碼:
import socket s = socket.socket() s.bind(('0.0.0.0', 12345)) s.listen() (client, addr) = s.accept() print(client) print(addr)
使用 nc
進行連接:
nc 127.0.0.1 12345
服務端會打印 client
和 addr
,然后正常退出,但是此時使用 netstat -anop | grep 12345
查看,發現對應連接并沒有被立即釋放
tcp 0 0 127.0.0.1:12345 127.0.0.1:59408 TIME_WAIT - timewait (28.18/0/0)
此時再次啟動服務端,發現報錯了:
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)
此時就不會出現地址被占用的提示了
在 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 //...
發現除了 SO_REUSEADDR
之外還有一個 SO_REUSEPORT
的選項,查詢后得知是 BSD
獨有的, Linux
并不能用
如果是客戶端綁定端口用這個屬性可能會出現剛連接上服務器就莫名其妙收到一個 FIN
的問題,導致其立即關閉,因此客戶端使用此選項時需注意
到此,相信大家對“python進程結束后端口被占用怎么解決”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。