欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python進(jìn)程結(jié)束后端口占用問題解析

 更新時(shí)間:2022年01月30日 14:50:57   作者:PinkD  
這篇文章主要為大家介紹了python中在進(jìn)程結(jié)束后端口依然被占用的問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步

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í)需注意

參考鏈接

socket連接關(guān)閉問題分析

PortProtection

以上就是python進(jìn)程結(jié)束后端口占用問題解析的詳細(xì)內(nèi)容,更多關(guān)于進(jìn)程結(jié)束后端口占用問題的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論