linux下C語言判斷網路是否連線

2021-08-09 16:32:51 字數 3113 閱讀 3552

本文改寫自網上的乙個程式,原始程式中為阻塞式呼叫,而且有程序建立的過程,非常不利於整合到自己程式中,因此對原始程式進行改造,使其可以完成傳送乙個imcp包的方式來判斷網路連通,只需要呼叫改進後的

bool netisok()

函式即可,該函式返回true即表示網路狀態良好,否則表示網路狀態不連同,本程式中只傳送了乙個icmp包,在實際應用中可以根據需要改進為傳送多個imcp包。

修改之後的程式為:只需要呼叫函式netisok()即可。原始碼如下所示:

[cpp]view plain

copy

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#define max_wait_time   1

#define max_no_packets  1

#define icmp_headsize 8 

#define packet_size     4096

struct

timeval tvsend,tvrecv;     

struct

sockaddr_in dest_addr,recv_addr;  

intsockfd;  

pid_t pid;  

char

sendpacket[packet_size];  

char

recvpacket[packet_size];  

//函式定義

void

timeout(

intsigno);  

unsigned short

cal_chksum(unsigned 

short

*addr,

intlen);  

intpack(

intpkt_no,

char

*sendpacket);  

intsend_packet(

intpkt_no,

char

*sendpacket);  

intrecv_packet(

intpkt_no,

char

*recvpacket);  

intunpack(

intcur_seq,

char

*buf,

intlen);  

void

tv_sub(

struct

timeval *out,

struct

timeval *in);  

void

_closesocket();  

bool

netisok()  

bcopy((char

*)host->h_addr,(

char

*)&dest_addr.sin_addr,host->h_length);  

dest_addr.sin_addr.s_addr = inet_addr("8.8.8.8"

);  

#endif

if((sockfd = socket(af_inet, sock_raw, ipproto_icmp)) < 0)   

intiflag;  

if(iflag = fcntl(sockfd,f_getfl,0)<0)  

iflag |= o_nonblock;  

if(iflag = fcntl(sockfd,f_setfl,iflag)<0)  

pid=getpid();  

for(i=0;i

if(recv_packet(i,recvpacket)>0)  

}   

_closesocket();           

return

false

;  }  

intsend_packet(

intpkt_no,

char

*sendpacket)  

return

1;  

}  int

pack(

intpkt_no,

char

*sendpacket)  

unsigned short

cal_chksum(unsigned 

short

*addr,

intlen)  

if( nleft==1)       

//若icmp報頭為奇數個位元組,會剩下最後一位元組.把最後乙個位元組視為乙個2位元組資料的高位元組,這個2位元組資料的低位元組為0,繼續累加

sum=(sum>>16)+(sum&0xffff);  

sum+=(sum>>16);  

answer=~sum;  

return

answer;  

}  int

recv_packet(

intpkt_no,

char

*recvpacket)  

}  gettimeofday(&tvrecv,null);   

if(unpack(pkt_no,recvpacket,n)==-1)  

continue

;  return

1;  

}  }  

intunpack(

intcur_seq,

char

*buf,

intlen)  

void

timeout(

intsigno)  

void

tv_sub(

struct

timeval *out,

struct

timeval *in)  

out->tv_sec-=in->tv_sec;  

}  void

_closesocket()    

linux下判斷網路是否連線

本文改寫自網上的乙個程式,原始程式中為阻塞式呼叫,而且有現成建立的過程,非常不利於整合到自己程式中,因此對原始程式進行改造,使其可以完成傳送乙個imcp包的方式來判斷網路連通,只需要呼叫改進後的 bool netisok 函式即可,該函式返回true即表示網路狀態良好,否則表示網路狀態不連同,本程式...

linux下判斷網路是否連線

本文改寫自網上的乙個程式,原始程式中為阻塞式呼叫,而且有程序建立的過程,非常不利於整合到自己程式中,因此對原始程式進行改造,使其可以完成傳送乙個imcp包的方式來判斷網路連通,只需要呼叫改進後的 bool netisok 函式即可,該函式返回true即表示網路狀態良好,否則表示網路狀態不連同,本程式...

linux下判斷網路是否連線

本文改寫自網上的乙個程式,原始程式中為阻塞式呼叫,而且有現成建立的過程,非常不利於整合到自己程式中,因此對原始程式進行改造,使其可以完成傳送乙個imcp包的方式來判斷網路連通,只需要呼叫改進後的 bool netisok 函式即可,該函式返回true即表示網路狀態良好,否則表示網路狀態不連同,本程式...