linux下判斷網路是否連線

2021-06-21 14:41:45 字數 3581 閱讀 1623

本文改寫自網上的乙個程式,原始程式中為阻塞式呼叫,而且有現成建立的過程,非常不利於整合到自己程式中,因此對原始程式進行改造,使其可以完成傳送乙個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);

intpack

(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

);#else

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

<

max_no_packets;i

++)if

(recv_packet(i

,recvpacket

)>0)

}_closesocket

();return

false;}

intsend_packet

(int

pkt_no

,char

*sendpacket

)return1;

}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;}

intrecv_packet

(int

pkt_no

,char

*recvpacket)}

gettimeofday

(&tvrecv

,null

);if

(unpack

(pkt_no

,recvpacket,n

)==-1)

continue

;return1;

}}intunpack

(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即表示網路狀態良好,否則表示網路狀態不連同,本程式...