`
java-mans
  • 浏览: 11392498 次
文章分类
社区版块
存档分类
最新评论

如何编码实现Windows下的ping功能

 
阅读更多

一、数据结构

首先根据IP数据包格式(图下图)定义IP数据包头的数据结构

IP数据包

然后根据ICMP回送请求与应答报文格式定义ICMP的数据结构

ICMP回送请求与应答

然后分别定义请求回送的数据长度

请求回送的数据结构

ICMP回送应答的数据结构

二、函数实现

(1)SendEchoRequest

函数功能是发送回送请求数据包,首先定义三个静态变量

static ECHOREQUEST echoReq; // 回送请求数据结构
static nId = 1; // 标识符
static nSeq = 1; // 序号

然后填写回送请求信息

echoReq.icmpHdr.Type = ICMP_ECHOREQ; // 类型
echoReq.icmpHdr.Code = 0; // 代码
echoReq.icmpHdr.Checksum = 0; // 校验和
echoReq.icmpHdr.ID = nId++; // 标识符

echoReq.icmpHdr.Seq = nSeq++; // 序号

填写要发送的数据
for (i = 0; i < REQ_DATASIZE; i++)
{
echoReq.cData[i] = ' ' + i;
}

保存发送时间
echoReq.dwTime = GetTickCount();

数据存入包中并计算校验和
echoReq.icmpHdr.Checksum = in_chsum((u_short*)&echoReq, sizeof(ECHOREQUEST));

发送回送请求
nRet = sendto(s,
(LPSTR)&echoReq,
sizeof(ECHOREQUEST),
0,
(LPSOCKADDR)lpstToAddr,
sizeof(SOCKADDR_IN));

(2)RecvEchoReply

函数功能为接收回送应答数据


DWORD RecvEchoReply(SOCKET s, LPSOCKADDR_IN lpsaFrom, u_char *pTTL)
{
ECHOREPLY echoReply; // 回送应答数据结构
int nRet;
int nAddrLen = sizeof(sockaddr_in);
// 接受回送应答
nRet = recvfrom(s,
(LPSTR)&echoReply,
sizeof(ECHOREPLY),
0,
(LPSOCKADDR)lpsaFrom,
&nAddrLen);
// 检查返回的值
if (nRet == SOCKET_ERROR)
{
ReportError("recvfrom()");
}
*pTTL = echoReply.ipHdr.TTL; // 取得TTL值
return (echoReply.echoRequest.dwTime); // 返回所用时间
}
(3)WaitForEchoReply

函数功能:等待套接子s是否有数据可读
int WaitForEchoReply(SOCKET s)
{
timeval Timeout;
fd_set readfds;
readfds.fd_count = 1;
readfds.fd_array[0] = s;
Timeout.tv_sec = 5;
Timeout.tv_usec = 0;
return (select(1, &readfds, NULL, NULL, &Timeout));
}

(3)in_chsum

函数功能计算校验和

u_short in_chsum(u_short *addr, int len)
{
register int nLeft = len;
register u_short *w = addr;
register u_short answer;
register int sum = 0;
while (nLeft > 1)
{
sum += *w++;
nLeft -= 2;
}

if (nLeft == 1)
{
u_short u = 0;
*(u_char*)(&u) = *(u_char*)w;
sum += u;
}

sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return (answer);
}

(4)main函数的实现

第一步:定义Winsock数据结构wsaData并新建版本号1.1

第二步:调用WSAStartup初始化wsaData

第三步:调用Ping函数

第四步:调用WSACleanup释放Winsock

void main(int argc, char **argv)
{
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(1, 1); // Winsock1.1
int nRet;

// 命令行参数检查
if (argc != 2)
{
fprintf(stderr, "/nUsage: ping hostname/n");
return;
}

// 初始化Winsock
nRet = WSAStartup(wVersionRequested, &wsaData);
if (nRet)
{
fprintf(stderr, "/nError initializing Winsock/n");
return;
}

if (wsaData.wVersion != wVersionRequested)
{
fprintf(stderr, "/nWinsock version not supported/n");
return;
}
// 调用ping函数
Ping(argv[1]);
//Ping("www.sina.com");
// 释放Winsock
WSACleanup();
}

(5)Ping

函数功能:实现ping功能

定义函数用到的数据

SOCKET rawSocket; // 原始套接字
LPHOSTENT lpHost; // 主机信息
sockaddr_in saDest; // 目的地址
sockaddr_in saSrc; // 源地址
DWORD dwTimeSent; // 发送时间
DWORD dwElapsed; // 延迟时间

然后创建一个原始套接字

创建一个原始套接口,协议为ICMP协议
rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

根据用户输入的目的地址获取

lpHost = gethostbyname(pstrHost);

设置目标套接口地址
saDest.sin_addr.s_addr = *((u_long FAR*)(lpHost->h_addr));
saDest.sin_family = AF_INET;
saDest.sin_port = 0;

输出ping程序的提示信息
printf("/nPinging %s [%s] with %d bytes of data:/n",
pstrHost,
inet_ntoa(saDest.sin_addr),
REQ_DATASIZE);


发送ICMP回送请求
SendEchoRequest(rawSocket, &saDest);
使用select()等待接收回送的数据

WaitForEchoReply(rawSocket);
接收应答
dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL);
计算传输时间,并输出提示信息
dwElapsed = GetTickCount() - dwTimeSent;

答应应答信息
printf("/nReply from: %s: bytes=%d time=%ldms TTL=%d",
inet_ntoa(saSrc.sin_addr),
REQ_DATASIZE,
dwElapsed,
cTTL);
}
// 关闭套接字
nRet = closesocket(rawSocket);

附:程序源代码

分享到:
评论

相关推荐

    C++实现ping功能代码

    该编码用C++实现了ping功能,即PC机与PC机间的通讯功能。

    虚拟现实:Windows操作系统的隐形后门

    使用imgur.com上的隐写编码图像的HTTP后门侠盗猎车手-一种有效载荷,用于通过现有服务的套接字执行shellcode, 从XP到W10均可运行细节通过使用tinystl并避免使用标准c ++ stl来实现小尺寸使用Windows光纤实现的协作...

    vc++ 开发实例源码包

    该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...

    EZwait.zip DOS(CMD)窗口和批处理命令如何实现等待(或睡眠)一定时长?小工具EZwait帮到你!目前版本:2

    (仅限Windows操作系统,需安装C++环境)平时有没有对于CMD窗口和批处理如何实现等待一定时长的问题感到困扰?我也是。我在网上也看到过类似的问题。有些利用ping,但是这样并不完美,甚至说不算一个方法。于是,我...

    SoftPerfect Network Scanner v7.2.0.zip

    还能实现带嗅探设置、统计分析、发包测试、进程监控、数据分析、编码转换和其他辅助功能(密码嗅探、邮件嗅探,文件传输嗅探等)的网络监视器,可以让你安装为网络驱动器共享文件夹,然后使用Windows资源管理器,...

    播出视频服务器的安全运维.docx

    创建Player通道 视频服务器中每一路编码通道、解码通道或半双工编解码通道,被称为一个Player通道,需要创建、配置相关参数并映射到物理设备,才能实现该编/解码通道的播出控制。 三.日常服务器维护操作 视频服务器...

    TCP/IP教程TCP/IP基础

    2.5.1 下一代Internet(NGI) 16 2.5.2 超速骨干网服务 16 2.5.3 Internet2(I2) 17 2.6 Internet管理组织 17 2.6.1 Internet协会 17 2.6.2 Internet体系结构组 17 2.6.3 Internet工程任务组 17 2.6.4 Internet工程指导...

    【满分答案】川大《计算机网络与通信》18春在线作业2答案.doc

    A、DOS操作系统 B、Windows98操作系统 C、WindowsNT操作系统 D、数据库操作系统 正确答案:C 满分:2 10 以下关于OSI七层模型中说法正确的是: A、应用层是为应用程序提供应用数据的编码和转换的功能 B、会话层是为...

    TCP/IP技术大全

    7.3.6 配置Windows 95或Windows 98 系统 61 7.4 安装WINS服务器 61 7.5 WINS管理和维护 62 7.5.1 加入静态表项 62 7.5.2 维护WINS数据库 63 7.5.3 备份WINS数据库 65 7.5.4 备份WINS注册项 65 7.5.5 恢复WINS数据库 ...

    TCP/IP详解

    2.5.1 下一代Internet(NGI) 16 2.5.2 超速骨干网服务 16 2.5.3 Internet2(I2) 17 2.6 Internet管理组织 17 2.6.1 Internet协会 17 2.6.2 Internet体系结构组 17 2.6.3 Internet工程任务组 17 2.6.4 Internet工程指导...

    北京中医药大学计算机应用基础第六次.doc

    调制调解器(modem)的功能是实现_____。 [1分] A.模拟信号与数字信号的转换 B.模拟信号的放大 C.数字信号的编码 D.数字信号的整形 C 9. 在PowerPoint中,停止幻灯片播放的快捷键是: [1分] A.Shift B.Enter C.Esc D....

    X-Scan

    “跳过没有响应的主机” - 如果X-Scan运行于NT4.0系统,只能通过ICMP Ping方式对目标主机进行检测,而在WIN2K以上版本的Windows系统下,若具备管理员权限则通过TCP Ping的方式进行存活性检测。 “跳过没有检测到...

    X-Scan v3.1

    “跳过没有响应的主机” - 如果X-Scan运行于NT4.0系统,只能通过ICMP Ping方式对目标主机进行检测,而在WIN2K以上版本的Windows系统下,若具备管理员权限则通过TCP Ping的方式进行存活性检测。 “跳过没有检测到...

    VB网络编程实例

    (自己的) ◆ 111.htm 在VB中实现文件上传 ◆ 112.htm 在VB中实现文件上载 ◆ 113.htm 在VB中使用UDP协议 ◆ 114.htm 在VB中用Outlook发电子邮件 ◆ 115.htm 在WindowsNT网络中广播消息 ...

    TCP/IP技术大全(中文PDF非扫描版)

    2.5.1 下一代Internet(NGI) 16 2.5.2 超速骨干网服务 16 2.5.3 Internet2(I2) 17 2.6 Internet管理组织 17 2.6.1 Internet协会 17 2.6.2 Internet体系结构组 17 2.6.3 Internet工程任务组 17 2.6.4 Internet工程指导...

    TCP-IP技术大全

    2.5.1 下一代Internet(NGI) 16 2.5.2 超速骨干网服务 16 2.5.3 Internet2(I2) 17 2.6 Internet管理组织 17 2.6.1 Internet协会 17 2.6.2 Internet体系结构组 17 2.6.3 Internet工程任务组 17 2.6.4 Internet工程指导...

    计算机应用技术(实用手册)

    如同系统BIOS的快取功能,启用影像BIOS的快取功能将允许存取影像BIOS自C0000H到C7FFFH具有快取功能,如果快取控制器也被启用。高速缓存的大小愈大,影像效能将会更快速。 Memory Hole At 15M-16M(扩展卡内存分配...

    TCPIP协议详解(4-1)

    WINS 55 7.1 NetBIOS 55 7.2 NetBIOS名字解析 57 7.3 动态NetBIOS名字解析 58 7.3.1 使用WINS的优点 58 7.3.2 WINS如何工作 59...7.3.5 配置NT 4.0系统 61 7.3.6 配置Windows 95或Windows 98 ...

    C#全能速查宝典

    《C#全能速查宝典》所讲的知识点按照功能和字母进行排序,读者既可以按照功能顺序查找,又可以按照字母顺序学习。 《C#全能速查宝典》不仅适合C#程序设计初学者,也可作为中、高级程序开发人员的参考手册。 ========...

Global site tag (gtag.js) - Google Analytics