tcp異常關閉後埠被占用情況的解決

2021-10-06 19:00:58 字數 2258 閱讀 3482

乙個服務端程序向作業系統申請乙個socket來監聽,但是當程序退出後,還未關閉的連線不會立即消失,而是會留給作業系統處理。作業系統會嘗試關閉這個連線。但是如果關閉時出現問題,這個連線就會一直處於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

服務端會列印clientaddr,然後正常退出,但是此時使用netstat -anop | grep 12345檢視,發現對應連線並沒有被立即釋放

tcp        0

0127.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

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

//...

小議socket關閉

portprotection

linux檢視埠被占用情況

linux 檢視埠占用情況可以使用 lsof 和 netstat 命令。如果linux中沒有這兩個命令,則yum安裝一下 yum install y lsof yum install y net toolslsof命令 lsof list open files 是乙個列出當前系統開啟檔案的工具。一般...

查詢埠號被占用情況

開始 執行 cmd 進入命令提示符 輸入netstat ano 即可看到所有連線的pid 之後在任務管理器中找到這個pid所對應的程式如果任務管理器中沒有pid這一項,可以在任務管理器中選 檢視 選擇列 經常,我們在啟動應用的時候發現系統需要的埠被別的程式占用,如何知道誰占有了我們需要的埠,很多人都...

80等埠被占用情況的解決

安裝或執行程式時提示 80等埠被占用情況的解決 巫師日記 發表於 2007 9 5 11 02 00 今天家裡電腦上架設的 不能訪問,進入 iis6 後 windows 2003系統 看到裡面的站點都不能啟動,提示有另乙個程式正在執行。在網上搜過之後,解決 在win2003的cmd命令視窗輸入net...