#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;
}相关推荐
基于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
SystemC实战:用C++搞芯片建模的5个典型场景(含代码示例)
本文通过五个典型实战场景,详细介绍了如何使用SystemC这一基于C++的硬件建模库进行芯片设计与系统级建模。内容涵盖从基础并发模块构建、事务级总线建模、跨时钟域验证,到与ModelSim协同仿真及多核系统性能探索,并提供了完整的代码示例,帮助软件工程师利用熟悉的C++工具链高效参与硬件架构设计与验证。
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使
【最全】ISTQB- FL模拟题(含答案)
汇总收集的所有ISTQB基础级考题和答案
1.1.4 运用防火墙实现入侵防御
摘要:本文详细介绍了某公司网络拓扑中防火墙FW1的配置过程。主要内容包括:1)通过web界面登录防火墙;2)配置三个接口的IP地址及所属安全区域;3)创建两个入侵防御配置文件(anti_untrust和anti_trust);4)配置安全策略untrust2dmz和trust2dmz,分别允许公网/内网访问WWW服务器;5)保存配置。操作步骤配有详细截图说明,涉及接口配置、安全区域划分、入侵防御策略设定等关键环节,最终实现内外网对服务器Server1的安全访问控制。(149字)
我使用websocket可以连接上我们的后台,但是不能发送数据和接收后台传的数据,一直在接收type:ping,这个问题哪位大佬可以帮忙解决一下
export default { data() { return { websock: null, } }, methods: { threadPoxi(){ // 实际调用的方法 ...
VAY 是 SAP 自动科目确定(OBYC-GBB)中的科目修改码,专用于带科目分配对象的销售订单发货场景,核心是触发 “Dr 成本要素科目(如销售费用 / 特定成本对象) Cr 库存商品” 的分录,
摘要:VAY是SAP中用于带科目分配对象(如成本中心、WBS)的销售订单发货的科目修改码,与标准VAX场景不同,它生成"借成本要素科目/贷库存商品"的分录。配置路径为OBYC-GBB-VAY,需确保借方科目为成本要素。典型业务场景包括免费样品、项目专用发货等。常见问题包括VAY未触发或科目记账错误,需检查销售订单科目分配、移动类型设置及OBYC配置。特殊场景建议单独配置科目以便费用分析。
Ping命令的实现
Ping (Packet Internet Groper)是一种因特网包探索器,用于测试网络连接量的程序。本文将基于 Socket 编程,实现一个基本的 Ping 命令程序。
火灾图像检测识别:cnn卷积神经网络 Adaboost 支持向量机 随机森林 决策树 完整代码数据
火灾图像检测识别:cnn卷积神经网络 Adaboost 支持向量机 随机森林 决策树 完整代码数据
基于STM32F103设计的智能门锁(支持多种开锁解锁方式)
这个智能锁模型是基于STM32平台开发的,支持多种开锁方式。其中,一种是使用RC522射频卡读卡器读取IC卡卡号和内部数据,并验证身份后开锁;另一种是通过连接蓝牙地址来确认业主身份,实现了蓝牙自动开锁功能;最后一种是通过ESP8266连接腾讯云物联网平台,并且用户可以通过微信小程序“腾讯连连”进行远程开锁和关锁。这样,用户就可以选择最方便的方式来进行开锁操作了。
[源码和文档分享]基于java的Ping程序的设计和实现
一 需求分析 已知参数:目的节点IP地址或主机名 设计要求:通过原始套接字编程,模拟Ping命令,实现其基本功能,即输入一个IP地址或一段IP地址的范围,分别测试其中每个IP地址所对应主机的可达性,并返回耗时、生存时间等参数,并统计成功发送和回送的Ping报文 初始化Wind...
在claude code中使用glm模型出现Unable to connect to Anthropic services的解决方案
本文主要介绍了在claude code中使用glm模型出现Unable to connect to Anthropic services的解决方案,希望能对使用claude code的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案
自己实现的 PING 命令···
#include #pragma comment(lib,"ws2_32.lib") #include #include #include // PingSock.cpp : 定义控制台应用程序的入口点。 // //#include "stdafx.h" /*******************************************************
Vue/React动态页面爬取:不用Playwright也能抓全数据的3个JS逆向技巧(附Python代码)
Vue/React动态页面的爬取核心是“绕过渲染,直达数据”:90%的场景下,API接口或初始数据足以满足需求,Playwright等渲染工具只应作为“最后手段”(如无API、参数加密极复杂)。记住:爬虫的效率与“模拟真实浏览器的程度”成反比——越少模拟浏览器,效率越高。掌握JS逆向技巧,既能避开Playwright的性能坑,又能提升爬虫的抗反爬能力,这才是动态页面爬取的最优解。
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
计算机控制技术及应用
《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字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
温度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" ...
ping程序的C#实现
编了一个.Net下的ping控制台程序,虽然简单,但是可见.Net的强大!以下是程序源码,望大家多多跟贴,讨论改进,一起成长!namespace Cornfield{ using System; using System.Net; using System.Net.Sockets; class MyPing { public static void Main(string[] ar
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
java linux ping_## ping 命令 在 java 中的使用
在 平时 访问 一个 网址的是否,出现 请求异常, 通常 会 用ping ip的方式 查看 ip 或者域名是否 能通;通的话,进一步查看 telnet ip port查看端口是否 可通的 方式进行排查。 如果对 路由做了设定,可以用 tracerout ip 的方式 查看路径是否合理。背景这次在项目中,在 项目中 涉及到 ip 在 交换机是否 配置成功的判断时, 经过向bmc 同学的咨询。参考 ...
Java 实现 Ping 命令
Ping是Windows、Unix和Linux系统下的一个命令。Ping也属于一个通信协议,是TCP/IP协议的一部分。利用 ping 命令可以检查网络是否连通。 百度百科上关于 Ping 的介绍写的还不错,可以参考。 尝试用Java 写了个简易的实现,代码如下: package com.coder4j.main; import jav...
计网实验大作业_ping程序实现
ping 程序实现 1.软件使用说明 本软件由源码和可执行文件.exe构成,运行.exe后可以看到控制台界面和一行提示“请输入要ping的域名或ip地址:”,在其后输入以www开头的域名或点分十进制格式的ip地址后回车,就能够ping对应的域名或ip地址。对于要ping的域名,软件会ping所有经过DNS域名解析服务器根据主机名解析得到对应的IP地址,因为一个域名可能对应到多个服务器,所以解析到的...
C# Socket实现两台电脑通信(一)
前期准备工作:两台电脑,并测试ping通两台电脑 几个有意思的概念要搞清楚: 1.ping 网络诊断工具:用于确定本地主机是否能与另一台主机成功交换(发送与接收)数据包,再根据返回的信息,就可以推断TCP/IP参数是否设置正确,以及运行是否正常、网络是否通畅等。 2.ipconfig可用于显示当前的TCP/IP配置的设置值,通常是用来检验人工配置的TCP/IP设置是否正确。 3.DOS命令:ipconfig、ping的应用 “win”+“R”(win就是键盘上长得像窗口的那个安按键):win键和R
1万+



被折叠的 条评论
为什么被折叠?



