ping的原理就是首先建立通道,然後傳送包,對方接受後返回資訊,這個包至少包括以下內容,傳送的時候,包的內容包括對方的ip位址和自己的位址,還有序列數,回送的時候包括雙方位址,還有時間等,主要是接受方在都是在作業系統核心裡做好的,時刻在監聽,提供一段c程式的**,希望對大家有用。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define packet_size 4096
#define max_wait_time 5
#define max_no_packets 3
char sendpacket[packet_size];
char recvpacket[packet_size];
int sockfd,datalen=56;
int nsend=0,nreceived=0;
struct sockaddr_in dest_addr;
pid_t pid;
struct sockaddr_in from;
struct timeval tvrecv;
void statistics(int signo);
unsigned short cal_chksum(unsigned short *addr,int len);
int pack(int pack_no);
void send_packet(void);
void recv_packet(void);
int unpack(char *buf,int len);
void tv_sub(struct timeval *out,struct timeval *in);
void statistics(int signo)
/*校驗和演算法*/
unsigned short cal_chksum(unsigned short *addr,int len)
/*若icmp報頭為奇數個位元組,會剩下最後一位元組。把最後乙個位元組視為乙個2位元組資料的高位元組,這個2位元組資料的低位元組為0,繼續累加*/
if( nleft==1)
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
answer=~sum;
return answer;
} /*設定icmp報頭*/
int pack(int pack_no)
/*傳送三個icmp報文*/
void send_packet()
/*確保所接收的是我所發的的icmp的回應*/
if( (icmp->icmp_type==icmp_echoreply) && (icmp->icmp_id==pid) )
else return -1;
} main(int argc,char *argv)
if( (protocol=getprotobyname("icmp") )==null)
/*生成使用icmp的原始套接字,這種套接字只有root才能生成*/
if( (sockfd=socket(af_i***,sock_raw,protocol->p_proto) )<0)
/* **root許可權,設定當前使用者許可權*/
setuid(getuid());
/*擴大套接字接收緩衝區到50k這樣做主要為了減小接收緩衝區溢位的
的可能性,若無意中ping乙個廣播位址或多播位址,將會引來大量應答*/
setsockopt(sockfd,sol_socket,so_rcvbuf,&size,sizeof(size) );
bzero(&dest_addr,sizeof(dest_addr));
dest_addr.sin_family=af_i***;
/*判斷是主機名還是ip位址*/
if( inaddr=i***_addr(argv[1])==inaddr_none)
memcpy( (char *)&dest_addr.sin_addr,host->h_addr,host->h_length);
} else /*是ip位址*/
memcpy( (char *)&dest_addr,(char *)&inaddr,host->h_length);
/*獲取main的程序id,用於設定icmp的標誌符*/
pid=getpid();
printf("ping %s(%s): %d bytes data in icmp packets./n",argv[1],
i***_ntoa(dest_addr.sin_addr),datalen);
send_packet(); /*傳送所有icmp報文*/
recv_packet(); /*接收所有icmp報文*/
statistics(sigalrm); /*進行統計*/
return 0;
} /*兩個timeval結構相減*/
void tv_sub(struct timeval *out,struct timeval *in)
out->tv_sec-=in->tv_sec;
} /*------------- the end -----------*/
ping 命令工作原理詳細解析
ping的原理就是首先建立通道,然後傳送包,對方接受後返回資訊,這個包至少包括以下內容,傳送的時候,包的內容包括對方的ip位址和自己的位址,還有序列數,回送的時候包括雙方位址,還有時間等,主要是接受方在都是在作業系統核心裡做好的,時刻在監聽,提供一段c程式的 希望對大家有用。include incl...
ping 命令工作原理詳細解析
ping的原理就是首先建立通道,然後傳送包,對方接受後返回資訊,這個包至少包括以下內容,傳送的時候,包的內容包括對方的ip位址和自己的位址,還有序列數,回送的時候包括雙方位址,還有時間等,主要是接受方在都是在作業系統核心裡做好的,時刻在監聽,提供一段c程式的 希望對大家有用。include incl...
ping命令知識 Ping命令工作原理詳解
在網路應用中,ping網速與ip位址等都是非常常用的命令,但大家知道ping命令的工作原理嗎?要知道這其中的奧秘,我們有必要來看看ping命令的工作過程到底是怎麼樣的。下面介紹下ping命令的詳細知識。ping命令的應用與原理 假定主機a的ip位址是192.168.1.1,主機b的ip位址是192....