ping 命令工作原理詳細解析

2021-03-31 17:55:03 字數 2834 閱讀 5092

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報頭*/

int unpack(char *buf,int len)

/*確保所接收的是我所發的的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....