Ping程序实现

ping程序实现 ping程序实现 【实验目的】  熟悉原始套接字编程的基本流程  理解ping程序的实现机制  理解ICMP协议的基于作用和报文格式。  完成原始套接字的配置。 【实验要求】 构造ICMP协议首部结构 构造ICMP回射请求结构。 构造ICMP回射应答结构。 构造IP首部结构。 创建原始套接字。 根据用户指定的地址获取目标IP。 对目标地址循环发送ICMP请求。 等待对方响应,并计算时间间隔。 【实验过程】 程序的运行过程 将相关的数据结构的定义写在ping.h头文件中,并将其包含着源文件pin 阅读详情

OSI模型与ICP/IP模型对比:

Ping通过发送ICMP回显请求来确定过一个主机是否存在:

#include "stdafx.h"
#include "Winsock2.h"
#pragma comment ( lib, "ws2_32.lib" )

#include <windows.h>
#include "stdio.h"

// 定义默认的缓冲区长度
#define DEF_BUF_SIZE		1024
// 定义IP包头长度
#define IP_HEADER_SIZE		20
// 定义ICMP包头长度
#define ICMP_HEADER_SIZE	( sizeof(ICMP_HEADER) )
// 定义ICMP包实体数据长度
#define ICMP_DATA_SIZE		32
// 定义ICMP包总长度
#define ICMP_PACK_SIZE		( ICMP_HEADER_SIZE + ICMP_DATA_SIZE )
// 定义ICMP包头
typedef struct _ICMP_HEADER {
	BYTE	bType ;			// 类型
	BYTE	bCode ;			// 代码
	USHORT	nCheckSum ;		// 校验和
	USHORT	nId ;			// 标识,本进程ID
	USHORT	nSequence ;		// 序列号
	UINT	nTimeStamp ;	// 可选项,这里为时间,用于计算时间
} ICMP_HEADER, *PICMP_HEADER ;

// 用于格式化输出信息的缓冲区
char szInfo[DEF_BUF_SIZE] ;

BOOL Ping ( char* lpDestIp ) ;
USHORT GetCheckSum ( LPBYTE lpBuf, DWORD dwSize ) ;

int main(int argc, char* argv[])
{
	int value[4] ;
	char szDestIp[DEF_BUF_SIZE] = {0} ;
	while ( scanf ( "%s", szDestIp) )
		Ping ( szDestIp ) ;
	return 0;
}

// 实现PING程序
// 参数:目标地址IP字符串,格式如“127.0.0.1”
BOOL Ping ( char* lpDestIp )
{
	// 设置目标地址
	SOCKADDR_IN DestSockAddr ;
	DestSockAddr.sin_family = AF_INET ;
	DestSockAddr.sin_addr.s_addr = inet_addr( lpDestIp ) ;
	DestSockAddr.sin_port = htons ( 0 ) ;

	// 创建ICMP回显请求包
	char ICMPPack[ICMP_PACK_SIZE] = {0} ;
	PICMP_HEADER pICMPHeader = (PICMP_HEADER)ICMPPack ;
	pICMPHeader->bType = 8 ;
	pICMPHeader->bCode = 0 ;
	pICMPHeader->nId = (USHORT)::GetCurrentProcessId() ;
	pICMPHeader->nCheckSum = 0 ;
	pICMPHeader->nTimeStamp = 0 ;
	memset ( &(ICMPPack[ICMP_HEADER_SIZE]), 'E', ICMP_DATA_SIZE ) ;	// 填充数据部分,内容任意

	// 初始化WinSock库
	WORD wVersionRequested = MAKEWORD( 2, 2 );
	WSADATA wsaData;
	if ( WSAStartup( wVersionRequested, &wsaData ) != 0 )
		return FALSE ;

	// 创建原始套接字
	SOCKET	RawSock = socket ( AF_INET, SOCK_RAW, IPPROTO_ICMP ) ;
	if ( RawSock == INVALID_SOCKET )
	{
		printf ( "Create socket error!\n" ) ;
		return FALSE ;
	}
	
	// 设置接收超时为1秒
	int nTime = 1000 ;
	int ret = ::setsockopt ( RawSock, SOL_SOCKET,SO_RCVTIMEO, (char*)&nTime, sizeof(nTime));
	
	char szRecvBuf [ DEF_BUF_SIZE] ;
	SOCKADDR_IN	SourSockAddr ;
	for ( int i = 0 ; i < 4; i++ )
	{
		pICMPHeader->nCheckSum = 0 ;				// 初始时校验值为0
		pICMPHeader->nSequence = i ;				// 序号
		pICMPHeader->nTimeStamp = ::GetTickCount() ;// 当前时间

		// 计算校验值,校验值要在ICMP数据报创建完才能计算
		pICMPHeader->nCheckSum = GetCheckSum ( (LPBYTE)ICMPPack, ICMP_PACK_SIZE ) ;
		
		// 发送ICMP数据包
		int nRet = ::sendto ( RawSock, ICMPPack, ICMP_PACK_SIZE,0,(SOCKADDR*)&DestSockAddr, sizeof(DestSockAddr) ) ;
		if ( nRet == SOCKET_ERROR )
		{
			printf ( "sendto error!\n" ) ;
			return FALSE ;
		}

		// 接收ICMP响应
		int nLen = sizeof(SourSockAddr) ;
		nRet = ::recvfrom ( RawSock, szRecvBuf, DEF_BUF_SIZE,0,(SOCKADDR*)&SourSockAddr, &nLen ) ;
		if ( nRet == SOCKET_ERROR )
		{
			if ( ::WSAGetLastError() == WSAETIMEDOUT )
			{
				printf ( "Request Timeout\n" ) ;
				continue ;
			}
			else
			{
				printf ( "recvfrom error!\n" ) ;
				return FALSE ;
			}
		}

		// 计算ICMP数据报的时间差
		int nTime = ::GetTickCount() - pICMPHeader->nTimeStamp ;

		int nRealSize = nRet - IP_HEADER_SIZE - ICMP_HEADER_SIZE ;
		if ( nRealSize < 0  )
		{
			printf ( "To less recv bytes!\n" ) ;
			continue ;
		}

		// 检测是否当前所发出的ICMP响应包
		PICMP_HEADER pRecvHeader = (PICMP_HEADER)(szRecvBuf+IP_HEADER_SIZE) ;
		if ( pRecvHeader->bType != 0 )
		{
			printf ( "Not ICMP respond type!\n" ) ;
			return FALSE ;
		}

		if ( pRecvHeader->nId != ::GetCurrentProcessId () )
		{
			printf ( "not valid id!\n" ) ;
			return FALSE ;
		}

		printf ( "%d bytes replay from %s : bytes=%d time=%dms\n", \
			nRet, inet_ntoa(SourSockAddr.sin_addr), nRealSize, nTime ) ;

		::Sleep ( 1000 ) ;
	}
	
	closesocket ( RawSock ) ;
	WSACleanup () ;

	return TRUE ;
}

// 计算ICMP包校验值
// 参数1:ICMP包缓冲区
// 参数2:ICMP包长度
USHORT GetCheckSum ( LPBYTE lpBuf, DWORD dwSize )
{
	DWORD	dwCheckSum = 0 ;
	USHORT* lpWord = (USHORT*)lpBuf ;

	// 累加
	while ( dwSize > 1 )
	{
		dwCheckSum += *lpWord++ ;
		dwSize -= 2 ;
	}

	// 如果长度是奇数
	if ( dwSize == 1 )
		dwCheckSum += *((LPBYTE)lpWord) ;

	// 高16位和低16位相加
	dwCheckSum = ( dwCheckSum >> 16 ) + ( dwCheckSum & 0xFFFF ) ;

	// 取反
	return (USHORT)(~dwCheckSum ) ;
}

Windows循环渐进-Ping程序实现代码 Windows循环渐进书籍中Ping程序实现代码#include "stdio.h" #include "iostream.h" #include "windows.h" //#include "winsock.h" #pragma comment(lib,"wsock32.lib") #define DEF_BUF_SIZE 1024 #define ICMP_DATA_SIZE 32 #define IP_HEADER_SIZE 20 #define ICMP_HEADER_SIZE 1 阅读详情

相关推荐

ICESat-2数据下载及处理分析随笔

ICESat-2全称是Ice,Cloud and land Elevation Satellite -2。看名字我们能知道它的任务是测ice,cloud和land elevation,而且这是一个Satellite,是一颗卫星。那么这里我们就要分清ICESat-2和ATLAS的关系,ICESat-2是星载平台,是一个space observatory,ATLAS是这个星载平台上搭载的单光子激光雷达系统。

u011322358的博客 1万+

Ping程序的实现(计网课设)

利用c语言实现的Ping命令,能用于测试一个主机到另一个主机间的联通情况,程序还提供了几个选项以实现不同的功能。 (1)实现Ping功能。程序能实现基本的Ping操作,发送ICMP回显请求报文,接收显应答报文。 (2)能输出指定条数的记录。程序提供了“-n”选项,用以输出指定条数的记录。 (3)能按照指定大小输出每条记录。程序提供了“datasize”选项,用以指定输出的数据报的大小。 (4)能输出用户帮助。程序提供了用户帮助,显示程序提供的选项以及选项格式等。

KUMAKAIHA的博客 9981

用友U8其中一个账套提示演示期已到期-修复方法

【事件始末】 一朋友求助,反馈使用的用友U8,很多年了! 突然发现其中账套2021年的一个账套打不开,提示演示期限已到期! 但是其他账套完全正常,可以打开,没有任何问题。 不管是还原老旧备份,还是重装软件问题依旧,无法自己解决。 客户查询报表结算账期,情况比较紧急,于是求助我们。 经过多次反复琢磨和烟酒,终于于晚上23点59分给弄了出来,也总是圆满解决问题了。 【问题分析】 该用户打的是 U82X免狗补丁,估计是该补丁文件设置了 最大有效期,补丁到期了导致的。 也有可能是程序...

u010431289的博客 2万+

Ping的实现(含程序)

最近在做计算机网络的课程设计,整理了一点资料。ping (Packet Internet Groper)是一种因特网包探索器,用于测试网络连接量的程序。Ping是工作在TCP/IP网络体系结构中应用层的一个服务命令, 主要是向特定的目的主机发送ICMP(Internet Control Message Protocol 因特网报文控制协议)请求报文,测试目的站是否可达及了解其有关状态 。...

wd0710的博客 6791

国产大模型 coding plan 实战决策指南:GLM、Kimi、豆包、abab 四大模型分层选型与工程落地

大模型辅助编程(coding assistant)正从概念验证走向规模化工程落地,其核心已不再是‘能否生成代码’,而是‘如何在真实开发流程中精准赋能’。理解模型能力边界、匹配技术栈特征、构建分层工作流(L1行级补全/L2函数生成/L3模块重构),是实现稳定提效的关键。GLM系列以工程稳定性见长,适合代码审计与测试生成;Kimi-Max凭借200K超长上下文胜任深度重构与合规审查;豆包响应快、框架适配深,是IDE高频补全的理想选择;abab系列则在IoT固件等跨模态场景中展现独特价值。本文聚焦国产模型在金融、

weixin_32238157的博客 427

使用ADS进行LNA低噪放设计的详细教程

详细介绍了通过ADS软件进行LNA设计的过程,从晶体管的选型到稳定性系数分析、再到输入输出端匹配,完整的讲解了低噪放的设计流程,可以使新手小白以及学习射频放大器的朋友可以快速的了解掌握ADS的使用方法和LNA的设计方法。

weixin_41831333的博客 3448

手把手教你实现 Ping 操作

手把手教大家实现 Ping 操作

胤凯的博客 2229

新手学习Vivado XDMA (1) - 配置详细分析

PCIe 在 Vivado XDMA 中的配置分析。

qq_18553915的博客 9707

ping实现

ping实现 icmp ping 报文内容结构

phone1126的专栏 669

产品经理-面试题目--持续更新

答:面试官,你好,我叫XXX,来自于XXXX,我系统的学习过软件开发,也主动的积累了不少产品方面的实战经验,在学习期间,我自己独立的完成了2个深度项目,一个是仿抖音的短视频APP全流程设计,另外一个是电商后台系统的模块,通过这些项目,我不仅熟练使用Axure等工具做出高保真原型图和清晰的产品框架,也形成了数据驱动和用户优先的思维习惯,另外,我也注重拓展自己的能力边界,拿到了CAIE人工智能证书,我希望能把AI能力融入到产品场景,提升体验和效率,我非常喜欢产品工作带来的创造性和逻辑性,希望有机会加入贵公司。

m0_63966958的博客 956

博途PLC模糊PID控制(附SCL完整源代码)

操作人员根据对象的当前状态和以往的控制经验,用手动控制的方法给出适当的控制量,对被控对象进行控制。用电脑模拟操作人员手动控制的经验,对被控对象进行控制。用模糊数学的知识模仿人脑的思维方式,对模糊现象进行识别和判决,给出精确的控制量,对被控对象进行控制。与经典控制理论和现代控制理论相比,模糊控制的特点是不需要建立对象的精确模型。根据操作人员手动控制的经验,总结的完整控制规则,在根据系统当前的运行状态,经过模糊推理,模糊判决等运算,求出控制量,实现对被控对象的控制。......

RXXW_Dor的博客 8963

ping的原理及实现

目录 1、介绍 2、原理 2.1、ICMP协议 2.1.1、ICMP介绍 2.1.2、ICMP头部 ​ 2.1.3、ICMP可能的消息列表 2.2、ping具体流程 2.2.1、在同一广播域内 2.2.2、在不同广播域 3、代码实现分析 4.运行截图 5、工程文件 1、介绍 ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具。 2、原理 pin...

qq_33690566的博客 2703

【数据集】中国广泛时空水质数据集(1980-2022)

简介中国广泛时空水质数据集(1980-2022)

WW、forever的博客 3991

原始套接字编程 | ping程序实现

【实验目的】 熟悉原始套接字编程的基本流程 理解ping程序的实现机制 理解ICMP协议的基于作用和报文格式。 完成原始套接字的配置。 【实验内容】 1.构造ICMP协议首部结构 2.构造ICMP回射请求结构。 3. 构造ICMP回射应答结构。 4. 构造IP首部结构。 5. 创建原始套接字。 6. 根据用户指定的地址获取目标IP。 7. 对目标地址循环发送ICMP请求。 8. 等待对方响应,并计算时间间隔。 Ping.h #pragma once // // Ping.h // #pragma

专注于C/C++/Linux领域创作 2714

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Windows下PING程序实现

跟着网上的代码试着敲了一遍,熟悉Ping的过程。 Ping.h //Ping.h //Define the header of IP and ICMP #pragma pack(1) #define ICMP_ECHOREPLY 0 #define ICMP_ECHOREQ 8 typedef struct tagIPHDR//the header of IP { u_char VIHL;

Abner 4022

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

windows下ping程序实现

windows下ping程序的实现:使用原始套接字SOCK_RAW,基于IP协议上的ICMP协议来实现,发送的ICMP数据包type为8(请求回复),收到的回复的ICMP数据包type为0,为了判断收到是数据包是本进程发送的。将ICMP包的id设置为本进程的ID。如果使用-r选项,会记录中间经过的route。 参考代码: // Description: // This sample i

luxiaoxun的专栏 3782

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

linux下ping程序实现

ping.h #ifndef __PING_H_ #define __PING_H_ #include <stdio.h> #include <stdlib.h> #include <linux/icmp.h> #include <linux/if_ether.h> #include <linux/ip.h> #include <sys/socket.h> #include <sys/types.h> #include &

fulianzhou的专栏 831

ping程序实现 z

大部分人用ping命令只是作为查看另一个系统的网络连接是否正常的一种简单方法。在这篇文章中,作者将介绍如何用C语言编写一个模拟ping命令功能的程序。ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具。ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者,这有点象潜水艇声纳系统中使用的发声装置。例如

433

linux 程序实现 ping,LINUX下 ping的源代码 C实现

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #definePACKET_SIZE4096#define MAX_WAIT_TIME5#define MAX_NO_PACK...

weixin_29790897的博客 391

linux 程序实现 ping,Linux网络编程篇之ICMP协议分析及ping程序实现

Linux网络编程系列:如果对Linux网络编程,对socket通信不是太清楚的同学,强烈推荐看一下上述的预备知识,说不定,就会喜欢上Linux的网络编程世界本系列会尽量对协议的部分进行介绍, 结合简单应用例子进行掌握学习.ping程序功能实现效果展示在这里插入图片描述ping.c程序代码/** @Author: D-lyw* @Date: 2018-11-01 17:00:20* @Last M...

weixin_29609679的博客 566
上一篇: C++调用gdalwarp.exe进行几何校正
下一篇: Qt信号和槽函数的四种实现方式
之乎者也哦
博客等级 码龄8年 7165粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值