如何利用ICMP協議自己實現ping的功能

2021-09-02 08:00:14 字數 3709 閱讀 7076

linux網路程式設計系列:

如果對linux網路程式設計,對socket通訊不是太清楚的同學,強烈推薦看一下上述的預備知識,說不定,就會喜歡上linux的網路程式設計世界

本系列會盡量對協議的部分進行介紹, 結合簡單應用例子進行掌握學習.

ping程式功能實現

效果展示

ping.c程式**

/*

* @author: d-lyw

* @date: 2018-11-01 17:00:20

* @last modified by: d-lyw

* @last modified time: 2018-12-01 17:01:42

* @description 在linux環境利用socket程式設計,基於icmp協議實現ping功能

*/#include

"ping.h"

#include

#include

#include

// struct icpmhdr, struct iphdr , gethostbyname, hostent

#include

#include

#include

#include

#include

#include

#include

#include

#include

char sendbuf[

1024];

// 用來存放將要傳送的ip資料報

struct sockaddr_in sockaddr, recvsock;

int sockaddr_len =

sizeof

(struct sockaddr)

;struct hostent *host;

int sockfd;

int ping_time =5;

intmain

(int argc,

char

const

*argv)

int on =1;

int pid;

int psend =

0, precv =0;

memset

(&sockaddr,0,

sizeof

(struct sockaddr));

if((sockaddr.sin_addr.s_addr =

inet_addr

(argv[1]

))== inaddr_none)

sockaddr.sin_addr =*(

struct in_addr *

)(host->h_addr);}

sockaddr.sin_family = af_inet;

// 建立原始套接字 sock_raw 協議型別 ipproto_icmpif(

(sockfd =

socket

(af_inet, sock_raw, ipproto_icmp))==

-1)setuid

(getpid()

);pid =

getpid()

;// 發包操作

printf

("pinging %s %d data send.\n"

, argv[1]

, icmp_data_len)

;int i =1;

int recvdatalen;

int senddatalen;

char

*recvbuf[

1024];

while

(ping_time--)if

((recvdatalen =

recvfrom

(sockfd, recvbuf,

sizeof

(recvbuf),0

,(struct sockaddr *

)&recvsock,

&sockaddr_len))==

-1)decodepack

(recvbuf, recvdatalen)

;sleep(1

);}return0;

}// 傳送ping資料報

intpackping

(int sendsqe)

intdecodepack

(char

*buf,

int len)

// 確認是本機發出的icmp報文的響應

if(icmp_hdr->icmp_type != icmp_echoreply || icmp_hdr->icmp_hun.ih_idseq.icd_id !=

getpid()

)gettimeofday

(&end,

null);

rtt =

timesubtract((

struct timeval *

)&icmp_hdr->icmp_data,

&end)

;printf

("received %d bytes from %s, ttl = %d, rtt = %f ms, icmpseq = %d \n"

, len,

inet_ntoa

(recvsock.sin_addr)

,ip_hdr->ttl, rtt, icmp_hdr->icmp_seq)

;return0;

}// 計算時間差

float

timesubtract

(struct timeval *begin,

struct timeval *end)

// 校驗和生成

ushort checksum

(unsigned

char

*buf,

int len)

if(len)

sum+=*

(unsigned

char

*)cbuf;

sum=

(sum>>16)

+(sum &

0xffff);

sum+

=(sum>>16)

;return

~sum;

}

ping.h程式**

#include

#include

#include

#include

#include

#include

#include

#define ipversion 4

#define icmp_data_len 56

intpackping

(int sendsqe)

;ushort checksum

(unsigned

char

*buf,

int len)

;int

decodepack

(char

*buf,

int len)

;float

timesubtract

(struct timeval *begin,

struct timeval *end)

;

icmp協議 ICMP協議如何保護網路安全?

icmp是乙個網路層協議,全稱是internet control message protocol,internet控制訊息協議。它是tcp ip協議族的乙個子協議,用於在ip主機 路由器之間傳遞控制訊息。控制訊息是指網路通不通 主機是否可達 路由是否可用等網路本身的訊息。這些控制訊息雖然並不傳輸使...

ICMP協議之ping實現

1.相關icmp協議概述 這裡只講解與ping有關的icmp訊息型別,主機傳送回送訊息 type 8 被請求主機回送響應訊息 type 0 基本格式如下 回送訊息 echo 回送響應訊息 echo reply 其中 code 0,checksum為校驗和,重點注意從icmp的頭部 即type開始 到...

ICMP協議之ping實現

1.相關icmp協議概述 這裡只講解與ping有關的icmp訊息型別,主機傳送回送訊息 type 8 被請求主機回送響應訊息 type 0 基本格式如下 回送訊息 echo 回送響應訊息 echo reply 其中 code 0,checksum為校驗和,重點注意從icmp的頭部 即type開始 到...