linux下判斷網路是否連線

2021-08-26 20:35:55 字數 2354 閱讀 7615

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