封裝Linux下網路連通性檢測函式

2021-07-03 05:47:38 字數 1322 閱讀 5447



我們在編寫網路通訊程式的時候,不論作為

服務端還是

客戶端,常常需要確保實時檢測與對方的連線狀態,呼叫select

函式監控

檔案描述符

(套接字

)的連線狀態是最普遍的方法,但是當遇到對方斷電或者網路線路突然斷開的情況,select函式將接收不到來自對方的斷開訊息,所以維護著這一連線的檔案描述符(套接字)已經沒有存在的意義,這個時候往該檔案描述符(套接字)內寫內容依然不會返回錯誤,read也會堵塞著並不返回錯誤。因此也無法斷定該套接字是否還處於連線狀態,我們可以通過開啟

tcp的keepalive選項來讓tcp連線自身維護自己的連線狀態,詳見《

linux下**異常斷開的tcp連線

》,但是倘若要及時檢測網路連通性,不得不頻繁地發

心跳包,勢必會影響通訊頻寬,不是很理想。  

另外一種辦法是在select

超時或者指定時間去connect一次對方,因為connect涉及到傳輸層跟應用層,為了消耗更少的頻寬,減少對於應用層的干擾,可以考慮呼叫

ping

命令走icmp

協議封裝

linux

下網路連通性檢測函式。下面是我用

c語言封裝的乙個檢測例項。

#include #include #include #include #include int checkconnect(char *dst, int cnt)

; char cmdbuf[256] = ;

if (null == dst || cnt <= 0)

return -1;

sprintf(cmdbuf, "ping %s -c %d -i 0.2 | grep time= | wc -l", dst, cnt);

stream = popen(cmdbuf, "r");

fread(recvbuf, sizeof(char), sizeof(recvbuf)-1, stream);

pclose(stream);

if (atoi(recvbuf) > 0)

return 0;

return -1;

}int main(int argc, char *argv)

if (checkconnect(argv[1], atoi(argv[2])))

printf("network is not up to %s\n", argv[1]);

else

printf("network is up to %s\n", argv[1]);

return 0;

}

網路連通性排查

一 測試網路連通性 1.nc netcat 命令 測試 udp 是否連通 nc vuz 192.168.1.10 1600 傳送 udp 報文 echo test nc w 1 u 192.168.1.10 1600 在a機器上傳送 udp報文 到b機器的1600埠 a機器上執行,輸入資料 nc u...

利用ansible檢測網路連通性 多個網段多IP

在雲平台的運維中,有時會遇到某個節點的乙個ip無法連通導致雲平台故障,比較常見的是ceph的某個osd節點storage網路不通導致osd全部down.為了快速檢測雲平台全部網路的連通性,利用ansible自帶的的fact,寫了個playbook,特記錄下.1 每台主機三個網絡卡 2 指令碼內容 3...

Linux 測試埠連通性

linux系統有時候需要測試某個埠的連通性,使用者可以參考如下方法來測試。telnet為使用者提供了在本地計算機上完成遠端主機工作的能力,因此可以通過telnet來測試埠的連通性,具體用法格式 telnet ip port 說明 port 是埠,比如80 如果telnet連線不存在的埠,那會如下圖所...