本文改寫自網上的乙個程式,原始程式中為阻塞式呼叫,而且有程序建立的過程,非常不利於整合到自己程式中,因此對原始程式進行改造,使其可以完成傳送乙個imcp包的方式來判斷網路連通,只需要呼叫改進後的
bool netisok()
函式即可,該函式返回true即表示網路狀態良好,否則表示網路狀態不連同,本程式中只傳送了乙個icmp包,在實際應用中可以根據需要改進為傳送多個imcp包。
修改之後的程式為:只需要呼叫函式netisok()即可。原始碼如下所示:
#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;
int sockfd;
pid_t pid;
char sendpacket[packet_size];
char recvpacket[packet_size];
//函式定義
void timeout(int signo);
unsigned short cal_chksum(unsigned short *addr,int len);
int pack(int pkt_no,char *sendpacket);
int send_packet(int pkt_no,char *sendpacket);
int recv_packet(int pkt_no,char *recvpacket);
int unpack(int cur_seq,char *buf,int len);
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)
int iflag;
if(iflag = fcntl(sockfd,f_getfl,0)<0)
iflag |= o_nonblock;
if(iflag = fcntl(sockfd,f_setfl,iflag)<0)
pid=getpid();
for(i=0;i0)
} _closesocket();
return false;}
int send_packet(int pkt_no,char *sendpacket)
return 1;}
int pack(int pkt_no,char*sendpacket)
unsigned short cal_chksum(unsigned short *addr,int len)
if( nleft==1) //若icmp報頭為奇數個位元組,會剩下最後一位元組.把最後乙個位元組視為乙個2位元組資料的高位元組,這個2位元組資料的低位元組為0,繼續累加
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
answer=~sum;
return answer;}
int recv_packet(int pkt_no,char *recvpacket)
} gettimeofday(&tvrecv,null);
if(unpack(pkt_no,recvpacket,n)==-1)
continue;
return 1; }}
int unpack(int cur_seq,char *buf,int len)
void timeout(int signo)
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下C語言判斷網路是否連線
本文改寫自網上的乙個程式,原始程式中為阻塞式呼叫,而且有程序建立的過程,非常不利於整合到自己程式中,因此對原始程式進行改造,使其可以完成傳送乙個imcp包的方式來判斷網路連通,只需要呼叫改進後的 bool netisok 函式即可,該函式返回true即表示網路狀態良好,否則表示網路狀態不連同,本程式...