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