socket实现ping命令(控制台)

windows下用C语言实现ping 右击生成的ping.exe文件,以管理员身份运行才能不会包10013错误等其他错误。// PingSock.cpp : 定义控制台应用程序的入口点。 // #include #include #pragma comment(lib,"ws2_32.lib") #include //定义默认缓冲区长度 #define DEF_BUF_SIZE 1024 #define IP_HEADER_SI 阅读详情
#include <winsock2.h>
#include <iostream>
#include <windows.h>
using namespace std;

#define DATA_SIZE 32
#define RECV_MAX_SZIE 1024
#pragma comment(lib, "ws2_32.lib")

typedef struct tag_icmphdr		//icmp头
{
	unsigned char	icmp_type;
	unsigned char	icmp_code;	
	unsigned short	icmp_checksum;
	unsigned short	icmp_id;
	unsigned short	icmp_sequence;
	unsigned long	icmp_timestamp;
} ICMPHDR, *PICMPHDR;

typedef struct tag_iphdr		//ip头
{
	UCHAR	iphVerLen;
	UCHAR	ipTOS;
	USHORT	ipLength;
	USHORT	ipID;
	USHORT	ipFlags;
	UCHAR	ipTTL;
	UCHAR	ipProtacol;
	USHORT	ipChecksum;
	ULONG	ipSource;
	ULONG	ipDestination;
} IPHDR;

USHORT CheckSum(USHORT *buf,int size)
{
	USHORT cksum=0;
	while(size>1)
	{
		cksum+=*buf++;
		size-=sizeof(USHORT);
	}
	if(size)
		cksum+=*buf++;
	cksum=(cksum>>16)+(cksum&0xffff);
	cksum+=(cksum>>16);
	return (USHORT)(~cksum);
}

void FillIcmp(PICMPHDR p)
{
	p->icmp_type = 8;
	p->icmp_code = 0;
	p->icmp_checksum = 0;
	p->icmp_id = (unsigned short)::GetCurrentProcessId();
	p->icmp_sequence = 0;
	p->icmp_timestamp = 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	WORD version = MAKEWORD(2,2);
	WSADATA data;
	WSAStartup(version, &data);
	if (LOBYTE(data.wVersion) != 2 || HIBYTE(data.wVersion) != 2)
	{
		cout << "WSAStartup failed" << endl;
		WSACleanup();
		return 0;
	}

	char ip[20];
	cout << "ping: ";
	cin >> ip;

	SOCKADDR_IN addr;															//目标主机地址
	addr.sin_family = AF_INET;
	addr.sin_addr.S_un.S_addr = inet_addr(ip);
	addr.sin_port = htons(0);
	
	SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);						//创建原始套接字

	int outTime = 1000;
	int rst;

	rst = setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&outTime, sizeof(int));	//设置发送超时
	if (SOCKET_ERROR == rst)
	{
		cout << "setsockopt erro" << endl;
		closesocket(sock);
		WSACleanup();
		return -1;
	}

	rst = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&outTime, sizeof(int));	//设置接收超时
	if (SOCKET_ERROR == rst)
	{
		cout << "setsockopt erro" << endl;
		closesocket(sock);
		WSACleanup();
		return -1;
	}


	char *icmp = (char*)malloc(sizeof(ICMPHDR)+DATA_SIZE);						//为icmp包申请内存
	memset(icmp, 0, sizeof(ICMPHDR)+DATA_SIZE);									//内存空间置零
	PICMPHDR picmp = (PICMPHDR)icmp;

	FillIcmp(picmp);															//填充icmp包
				
	unsigned short sequence = 0;												//序列号
	int count = 4;																//发送请求次数
	char recvbuf[RECV_MAX_SZIE];												//接收buf
	SOCKADDR_IN addrfrom;														//接收地址
	int len = sizeof(SOCKADDR);													//地址大小
	int ipTTL = 0;																//TTL
	
	while (count--)
	{
		picmp->icmp_checksum = 0;
		picmp->icmp_timestamp = ::GetTickCount();
		picmp->icmp_sequence = sequence++;
		picmp->icmp_checksum = CheckSum((USHORT*)icmp, sizeof(ICMPHDR)+DATA_SIZE);

		int result;
		result = sendto(sock, icmp, sizeof(ICMPHDR)+DATA_SIZE, 0, (SOCKADDR*)&addr, sizeof(SOCKADDR));	//向目标主机发送icmp请求包
		if (SOCKET_ERROR == result)
		{
			if (WSAETIMEDOUT == WSAGetLastError())
			{
				cout << "time out" << endl;
				continue;
			}
			else
			{
				cout << "sendto error" << endl;
				closesocket(sock);
				WSACleanup();
				return -1;
			}
		}

		result = recvfrom(sock, recvbuf, RECV_MAX_SZIE, 0, (SOCKADDR*)&addrfrom, &len);					//接收目标主机的icmp应答包
		if (SOCKET_ERROR == result)
		{
			if (WSAETIMEDOUT == GetLastError())
			{
				cout << "time out" << endl;
				continue;
			}
			else
			{
				cout << "recvform error" << endl;
				closesocket(sock);
				WSACleanup();
				return -1;
			}
		}

		int nTick = ::GetTickCount();
		if (result < sizeof(IPHDR) + sizeof(ICMPHDR) + DATA_SIZE)
		{
			cout << "too few bytes" << endl;
		}

		IPHDR *pIP = (IPHDR*)recvbuf;
		ipTTL = (int)pIP->ipTTL;	//获取目标主机TTL

		PICMPHDR p = (PICMPHDR)(recvbuf+sizeof(IPHDR));
		if (p->icmp_type != 0)
		{
			cout << "error type " << p->icmp_type << " receved" << endl;
			return -1;
		}

		if (p->icmp_id != (USHORT)::GetCurrentProcessId())
		{
			cout << "someone else's packet" << endl;
			return -1;
		}

		cout << "reply from: " << inet_ntoa(addrfrom.sin_addr);
		cout << " data: " << DATA_SIZE << "bytes ";	
		cout << " time: " << nTick-p->icmp_timestamp << "ms";
		cout << " TTL=" << ipTTL << endl;
	}
	
	return 0;
}

使用SOCK_DGRAM类型的socket实现的ping程序 SOCK_DGRAM类型的socket常用于UDP通信,本文将尝试把这种socket用于ICMP协议,并完成一个简单的ping程序。使用ping去测试某个主机是否可用可能是一件很平常的事,尽管ping非常普通,但是编写一个实现ping功能的程序却并不是那么简单,因为ping使用的ICMP协议并不是一个应用层协议,本文简要介绍ICMP协议,并给出一个使用普通的常用于UDP通信的socket实现ping的实例,本文将提供完整的源程序;阅读本文需要熟悉socket编程,对初学者而言,本文有一定的难度。 阅读详情

相关推荐

基于socket实现Ping功能的源代码

基于socket的网络编程技术,用到SOCK_RAW的原始套接字类型。里面对简单ICMP协议和IP协议有着很完整的诠释和定义。可以交流zhaquanmin@163.com

socket实现Ping命令

实现的原理还是很简单的,主要还是要对ICMP协议有所了解。ICMP协议是在IP协议的数据部分实现的,普通的socket只能建立TCP或者UDP连接,实在传输层上做东西,只能控制要传输的数据,不能控制IP包的数据部分(即ICMP包实现的部分),所以我们需要一个原始套接字填充IP协议的数据部分。 #define WIN32_LEAN_AND_MEAN #include "stdafx.h" #inc

ChenYitian 1万+

SystemC实战:用C++搞芯片建模的5个典型场景(含代码示例)

本文通过五个典型实战场景,详细介绍了如何使用SystemC这一基于C++的硬件建模库进行芯片设计与系统级建模。内容涵盖从基础并发模块构建、事务级总线建模、跨时钟域验证,到与ModelSim协同仿真及多核系统性能探索,并提供了完整的代码示例,帮助软件工程师利用熟悉的C++工具链高效参与硬件架构设计与验证。

weixin_29191761的博客 316

PC可以ping通SoC 但SoC不能ping通PC

文章目录方法一:关闭专用网络防火墙方法二:单独关闭SoC使用的以太网连接的防火墙step1:找到SoC使用的以太网连接step2:关闭单独的以太网连接 问题描述:SoC的系统为ubuntu,SoC通过Ethernet连接PC(Win10),PC使用cmd.exe可以ping通SoC,但是SoC却不能ping通PC。 方法一:关闭专用网络防火墙 设置PC的专用网络防火墙为关闭的状态即可,此方法简单粗暴,但是带来的问题是,如果还连接有其他的网络都将不受保护。由此我们可以使用方法二。 方法二:单独关闭SoC使

Mr_kanger的博客 565

【最全】ISTQB- FL模拟题(含答案)

汇总收集的所有ISTQB基础级考题和答案

maoxuexue的博客 1万+

1.1.4 运用防火墙实现入侵防御

摘要:本文详细介绍了某公司网络拓扑中防火墙FW1的配置过程。主要内容包括:1)通过web界面登录防火墙;2)配置三个接口的IP地址及所属安全区域;3)创建两个入侵防御配置文件(anti_untrust和anti_trust);4)配置安全策略untrust2dmz和trust2dmz,分别允许公网/内网访问WWW服务器;5)保存配置。操作步骤配有详细截图说明,涉及接口配置、安全区域划分、入侵防御策略设定等关键环节,最终实现内外网对服务器Server1的安全访问控制。(149字)

Ljs040411的博客 2135

我使用websocket可以连接上我们的后台,但是不能发送数据和接收后台传的数据,一直在接收type:ping,这个问题哪位大佬可以帮忙解决一下

export default { data() { return { websock: null, } }, methods: { threadPoxi(){ // 实际调用的方法 ...

weixin_43092354的博客 8046

VAY 是 SAP 自动科目确定(OBYC-GBB)中的科目修改码,专用于带科目分配对象的销售订单发货场景,核心是触发 “Dr 成本要素科目(如销售费用 / 特定成本对象) Cr 库存商品” 的分录,

摘要:VAY是SAP中用于带科目分配对象(如成本中心、WBS)的销售订单发货的科目修改码,与标准VAX场景不同,它生成"借成本要素科目/贷库存商品"的分录。配置路径为OBYC-GBB-VAY,需确保借方科目为成本要素。典型业务场景包括免费样品、项目专用发货等。常见问题包括VAY未触发或科目记账错误,需检查销售订单科目分配、移动类型设置及OBYC配置。特殊场景建议单独配置科目以便费用分析。

金牌架构师 1256

Ping命令的实现

Ping (Packet Internet Groper)是一种因特网包探索器,用于测试网络连接量的程序。本文将基于 Socket 编程,实现一个基本的 Ping 命令程序。

qq_37409526的博客 2492

火灾图像检测识别:cnn卷积神经网络 Adaboost 支持向量机 随机森林 决策树 完整代码数据

火灾图像检测识别:cnn卷积神经网络 Adaboost 支持向量机 随机森林 决策树 完整代码数据

864

基于STM32F103设计的智能门锁(支持多种开锁解锁方式)

这个智能锁模型是基于STM32平台开发的,支持多种开锁方式。其中,一种是使用RC522射频卡读卡器读取IC卡卡号和内部数据,并验证身份后开锁;另一种是通过连接蓝牙地址来确认业主身份,实现了蓝牙自动开锁功能;最后一种是通过ESP8266连接腾讯云物联网平台,并且用户可以通过微信小程序“腾讯连连”进行远程开锁和关锁。这样,用户就可以选择最方便的方式来进行开锁操作了。

3万+

[源码和文档分享]基于java的Ping程序的设计和实现

一 需求分析 已知参数:目的节点IP地址或主机名 设计要求:通过原始套接字编程,模拟Ping命令,实现其基本功能,即输入一个IP地址或一段IP地址的范围,分别测试其中每个IP地址所对应主机的可达性,并返回耗时、生存时间等参数,并统计成功发送和回送的Ping报文 初始化Wind...

chuiqi9947的博客 170

在claude code中使用glm模型出现Unable to connect to Anthropic services的解决方案

本文主要介绍了在claude code中使用glm模型出现Unable to connect to Anthropic services的解决方案,希望能对使用claude code的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 13万+

自己实现的 PING 命令···

#include #pragma comment(lib,"ws2_32.lib") #include #include #include // PingSock.cpp : 定义控制台应用程序的入口点。 // //#include "stdafx.h" /*******************************************************

kingoverlord的专栏 1260

Vue/React动态页面爬取:不用Playwright也能抓全数据的3个JS逆向技巧(附Python代码)

Vue/React动态页面的爬取核心是“绕过渲染,直达数据”:90%的场景下,API接口或初始数据足以满足需求,Playwright等渲染工具只应作为“最后手段”(如无API、参数加密极复杂)。记住:爬虫的效率与“模拟真实浏览器的程度”成反比——越少模拟浏览器,效率越高。掌握JS逆向技巧,既能避开Playwright的性能坑,又能提升爬虫的抗反爬能力,这才是动态页面爬取的最优解。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1600

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C#实现Ping命令

以下是源代码,建一个控制台程序,然后把代码Copy进去就可以了~~ using System;using System.Collections;using System.Data;using System.Net;using System.Net.Sockets;namespace PPing{ /// /// Summary descri

优秀技术文章收录 6250

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Python 实现ping工具。可配置多个ip

python 27下实现,python3下可能会报错 采用socket的方式,能实现统计每个ip的总耗时。也可采用调用windows的ping命令。 #!/usr/bin/env python #coding:GBK ''' author: wikeryong date: 2013-09-14 09:35:59 ''' import socket import sys import

猫叔的专栏 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

windows下ping程序使用C语言实现

vc++6.0或者更高版本vs新建win32 console项目,选简单的Hello world项目,删除自动生成的代码,增加如下代码,链接(F7)(不要运行)后在该项目的Debug目录下使用命令行方式运行程序。// iping.cpp : Defines the entry point for the console application. // #include "stdafx.h" ...

renaway的博客 3807

ping程序的C#实现

编了一个.Net下的ping控制台程序,虽然简单,但是可见.Net的强大!以下是程序源码,望大家多多跟贴,讨论改进,一起成长!namespace Cornfield{  using System;  using System.Net;  using System.Net.Sockets;  class MyPing  {    public static void Main(string[] ar

今日红缨在手 1530

VC++控制台下ping功能的代码

http://read.pudn.com/downloads80/sourcecode/windows/network/307147/Ping/Ping.cpp__.htm // #pragma pack(4) // #pragma comment(lib, "ws2_32.lib") // #include "stdafx.h" // #include // #inclu

ilikehigame的专栏 2308

java linux ping_## ping 命令 在 java 中的使用

在 平时 访问 一个 网址的是否,出现 请求异常, 通常 会 用ping ip的方式 查看 ip 或者域名是否 能通;通的话,进一步查看 telnet ip port查看端口是否 可通的 方式进行排查。 如果对 路由做了设定,可以用 tracerout ip 的方式 查看路径是否合理。背景​这次在项目中,在 项目中 涉及到 ip 在 交换机是否 配置成功的判断时, 经过向bmc 同学的咨询。参考 ...

weixin_34997870的博客 526

Java 实现 Ping 命令

Ping是Windows、Unix和Linux系统下的一个命令。Ping也属于一个通信协议,是TCP/IP协议的一部分。利用 ping 命令可以检查网络是否连通。 百度百科上关于 Ping 的介绍写的还不错,可以参考。 尝试用Java 写了个简易的实现,代码如下: package com.coder4j.main; import jav...

weixin_34019929的博客 179

计网实验大作业_ping程序实现

ping 程序实现 1.软件使用说明 本软件由源码和可执行文件.exe构成,运行.exe后可以看到控制台界面和一行提示“请输入要ping的域名或ip地址:”,在其后输入以www开头的域名或点分十进制格式的ip地址后回车,就能够ping对应的域名或ip地址。对于要ping的域名,软件会ping所有经过DNS域名解析服务器根据主机名解析得到对应的IP地址,因为一个域名可能对应到多个服务器,所以解析到的...

tgyy_cool的博客 1898

C# Socket实现两台电脑通信(一)

前期准备工作:两台电脑,并测试ping通两台电脑 几个有意思的概念要搞清楚: 1.ping 网络诊断工具:用于确定本地主机是否能与另一台主机成功交换(发送与接收)数据包,再根据返回的信息,就可以推断TCP/IP参数是否设置正确,以及运行是否正常、网络是否通畅等。 2.ipconfig可用于显示当前的TCP/IP配置的设置值,通常是用来检验人工配置的TCP/IP设置是否正确。 3.DOS命令:ipconfig、ping的应用 “win”+“R”(win就是键盘上长得像窗口的那个安按键):win键和R

qq_26572229的博客 4716
上一篇: socket聊天程序(多线程,控制台)
下一篇: Option to use with setsockopt at the IPPROTO_IP level
CButtonST
博客等级 码龄16年 42粉丝 15原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值