Socket程式設計中檢測埠是否被占用

2021-08-07 20:18:42 字數 1639 閱讀 4619

一般檢測乙個埠是否被占用的方法是看bind是否成功,其實在windows中有兩個api可以獲取到當前系統埠的占用情況(gettcptable/getudptable),利用這兩個函式就可檢測埠占用情況。

但在較複雜系統環境下,埠占用表可能隨時改變,可能存在兩個以上程序使用上述方法檢測到同一空閒埠,在這種情況下,可使用bind方法進行埠選擇。

一、通過gettcptable/getudptable方法獲取埠占用情況。

[cpp]view plain

copy

#include 

#include 

//依賴lib庫 iphlpapi.lib ws2_32.lib

//獲取tcp埠狀態

bool

gettcpportstate(

ulong

nport, 

ulong

*nstateid)  

}  }  return

false;  

}  return

false;  

}  //獲取udp埠狀態

bool

getu***ortstate(

ulong

nport, 

ulong

*nstateid)  

}  }  return

false;  

}  return

false;  

}  

二、通過bind函式,判斷埠是否被占用。

1、原始socket程式設計時,就使用bind函式判斷。

[cpp]view plain

copy

unsigned 

short

usport = 9090;  

socket s = socket(af_inet,sock_stream,ipproto_ip);  

sockaddr_in addr;  

addr.sin_family = af_inet;  

addr.sin_port = htons(usport);  

addr.sin_addr.s_addr = htonl(inaddr_any);  

bind(s,(lpsockaddr)&addr,sizeof

(addr));  

if(wsagetlasterror()==wsaeaddrinuse)    

2、使用boost asio庫時,如何判斷埠被占用,使用new socket或bind失敗時來判斷。

[cpp]view plain

copy

boost::asio::io_service ioservice;  

unsigned short

usport = 9090;  

udp::socket * psockudp = null;  

bool

bsockudperror = 

false

;  try

catch

(...)  

//釋放

if(!bsockudperror && psockudp != null)    

檢測socket鏈結是否斷開

解決方案 1.傳送重試,由業務完成。因為club l5的send介面不會保留使用者傳送的內容,在recv失敗的情況下,使用者傳送的資料已經丟失,所以只能由業務進行重試。結論 否定。由於後端伺服器有多台,每次傳送的時候並不能不能保證連線的機器還是上次傳送的那一台伺服器,有可能後端所有的連線都被斷開,雖...

檢測tcp udp埠是否可用

我們一般檢查服務的埠是否可用,通常使用telnet工具。使用方法 若telnet未安裝,yum安裝方法為 yum install telnet server yum list telnet yum install telnet.但如果是udp的服務,telnet檢測就會失效,因為telnet是基於t...

linux 檢測遠端埠是否開啟

常用telnet 110.101.101.101 80方式測試遠端主機埠是否開啟。方法1.nmap ip p port 測試埠 1.1 nmap ip 顯示全部開啟的埠 根據顯示close open確定埠是否開啟。方法2.nc v host port 埠未開啟返回狀態為非0 一 telnet 此法常...