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開始 到...