我們在編寫網路通訊程式的時候,不論作為
服務端還是
客戶端,常常需要確保實時檢測與對方的連線狀態,呼叫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連線不存在的埠,那會如下圖所...