本文改寫自網上的乙個程式,原始程式中為阻塞式呼叫,而且有程序建立的過程,非常不利於整合到自己程式中,因此對原始程式進行改造,使其可以完成傳送乙個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即表示網路狀態良好,否則表示網路狀態不連同,本程式...