ping程序实现

本文详细介绍了如何实现ping程序,旨在熟悉原始套接字编程,理解ICMP协议及其报文格式。实验要求包括构造ICMP和IP首部,创建原始套接字,向目标地址发送ICMP请求并计算响应时间。通过示例展示了myping程序的运行过程,解释了如何将主机名转换为IP地址,并捕获了数据包进行分析。
摘要由CSDN通过智能技术生成

ping程序实现

【实验目的】

 熟悉原始套接字编程的基本流程
 理解ping程序的实现机制
 理解ICMP协议的基于作用和报文格式。
 完成原始套接字的配置。

【实验要求】
  1. 构造ICMP协议首部结构
  2. 构造ICMP回射请求结构。
  3. 构造ICMP回射应答结构。
  4. 构造IP首部结构。
  5. 创建原始套接字。
  6. 根据用户指定的地址获取目标IP。
  7. 对目标地址循环发送ICMP请求。
  8. 等待对方响应,并计算时间间隔。
【实验过程】
  1. 程序的运行过程
    将相关的数据结构的定义写在ping.h头文件中,并将其包含着源文件ping.c中。编译通过后,在命令窗口执行。根据用户输入的主机名称或ip地址,向对方发送ICMP请求报文,收到回复的ICMP应答报文后,计算时间差来显示与对方的连通情况。具体的运行结果如下图所示。
    在这里插入图片描述
    从图中可以看到,myping程序的输入参数是www.baidu.com。程序中调用gethostbyname()函数将主机名转换为ip地址61.135.185.32。并循环四次向该地址发送ICMP请求包,每次收到ICMP应答包后计算往返的时间间隔。数据包包括8个字节的ICMP协议头,32个字节包括ICMP协议的数据,其中协议头中包含时间字段。
  2. 数据抓包
    使用使用wireshark软件,可以将程序运行过程中发送和接收到的数据包捕获到。
    在这里插入图片描述
【实验代码】
  1. 头文件 ping.h
#pragma pack(1)
#define ICMP_ECHOREPLY	0
#define ICMP_ECHOREQ	8

// IP Header -- RFC 791
typedef struct tagIPHDR
{
   
   u_char  VIHL;			// Version and IHL
   u_char	TOS;			// Type Of Service
   short	TotLen;			// Total Length
   short	ID;				// Identification
   short	FlagOff;		// Flags and Fragment Offset
   u_char	TTL;			// Time To Live
   u_char	Protocol;		// Protocol
   u_short	Checksum;		// Checksum
   struct	in_addr iaSrc;	// Internet Address - Source
   struct	in_addr iaDst;	// Internet Address - Destination
}IPHDR, * PIPHDR;


// ICMP Header - RFC 792
typedef struct tagICMPHDR
{
   
   u_char	Type;			// Type
   u_char	Code;			// Code
   u_short	Checksum;		// Checksum
   u_short	ID;				// Identification
   u_short	Seq;			// Sequence
   char	Data;			// Data
}ICMPHDR, * PICMPHDR;


#define REQ_DATASIZE 32		// Echo Request Data size

// ICMP Echo Request
typedef struct tagECHOREQUEST
{
   
   ICMPHDR icmpHdr;
   DWORD	dwTime;
   char	cData[REQ_DATASIZE];
}ECHOREQUEST, * PECHOREQUEST;


// ICMP Echo Reply
typedef struct tagECHOREPLY
{
   
   IPHDR	ipHdr;
   ECHOREQUEST	echoRequest;
   char    cFiller[256];
}ECHOREPLY, * PECHOREPLY;

#pragma pack()
#pragma once

  1. 源程序ping.cpp
// PING.C -- Ping program using ICMP and RAW Sockets
//

#define _WINSOCK_DEPRECATED_NO_WARNINGS
//#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
//#include <winsock.h>
#include <WinSock2.h>
#pragma comment (lib,"Ws2_32.lib")
#include "ping.h"

// Internal Functions
void Ping(LPCSTR pstrHost);
void ReportError(LPCSTR pstrFrom);
int  WaitForEchoReply
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值