乙個服務端程序向作業系統申請乙個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
服務端會列印client
和addr
,然後正常退出,但是此時使用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...