91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python進程結束后端口被占用怎么解決

發布時間:2022-02-07 15:15:25 來源:億速云 閱讀:896 作者:iii 欄目:開發技術

本篇內容主要講解“python進程結束后端口被占用怎么解決”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“python進程結束后端口被占用怎么解決”吧!

socket分配

一個服務端進程向操作系統申請一個 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進程結束后端口被占用怎么解決”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乌海市| 于田县| 成都市| 固始县| 石家庄市| 米泉市| 岳阳县| 涞源县| 郎溪县| 九龙坡区| 云阳县| 兰溪市| 泾源县| 闻喜县| 佛冈县| 淳安县| 神木县| 德江县| 咸宁市| 北碚区| 建平县| 江油市| 宝兴县| 鞍山市| 姚安县| 逊克县| 姜堰市| 从化市| 和田县| 巫山县| 衡南县| 始兴县| 肥城市| 大冶市| 沾化县| 章丘市| 海门市| 新丰县| 贵定县| 顺平县| 绍兴市|