一、数据结构
首先根据IP数据包格式(图下图)定义IP数据包头的数据结构
然后根据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功能,即PC机与PC机间的通讯功能。
使用imgur.com上的隐写编码图像的HTTP后门侠盗猎车手-一种有效载荷,用于通过现有服务的套接字执行shellcode, 从XP到W10均可运行细节通过使用tinystl并避免使用标准c ++ stl来实现小尺寸使用Windows光纤实现的协作...
该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...
(仅限Windows操作系统,需安装C++环境)平时有没有对于CMD窗口和批处理如何实现等待一定时长的问题感到困扰?我也是。我在网上也看到过类似的问题。有些利用ping,但是这样并不完美,甚至说不算一个方法。于是,我...
还能实现带嗅探设置、统计分析、发包测试、进程监控、数据分析、编码转换和其他辅助功能(密码嗅探、邮件嗅探,文件传输嗅探等)的网络监视器,可以让你安装为网络驱动器共享文件夹,然后使用Windows资源管理器,...
创建Player通道 视频服务器中每一路编码通道、解码通道或半双工编解码通道,被称为一个Player通道,需要创建、配置相关参数并映射到物理设备,才能实现该编/解码通道的播出控制。 三.日常服务器维护操作 视频服务器...
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工程指导...
A、DOS操作系统 B、Windows98操作系统 C、WindowsNT操作系统 D、数据库操作系统 正确答案:C 满分:2 10 以下关于OSI七层模型中说法正确的是: A、应用层是为应用程序提供应用数据的编码和转换的功能 B、会话层是为...
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数据库 ...
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工程指导...
调制调解器(modem)的功能是实现_____。 [1分] A.模拟信号与数字信号的转换 B.模拟信号的放大 C.数字信号的编码 D.数字信号的整形 C 9. 在PowerPoint中,停止幻灯片播放的快捷键是: [1分] A.Shift B.Enter C.Esc D....
“跳过没有响应的主机” - 如果X-Scan运行于NT4.0系统,只能通过ICMP Ping方式对目标主机进行检测,而在WIN2K以上版本的Windows系统下,若具备管理员权限则通过TCP Ping的方式进行存活性检测。 “跳过没有检测到...
“跳过没有响应的主机” - 如果X-Scan运行于NT4.0系统,只能通过ICMP Ping方式对目标主机进行检测,而在WIN2K以上版本的Windows系统下,若具备管理员权限则通过TCP Ping的方式进行存活性检测。 “跳过没有检测到...
(自己的) ◆ 111.htm 在VB中实现文件上传 ◆ 112.htm 在VB中实现文件上载 ◆ 113.htm 在VB中使用UDP协议 ◆ 114.htm 在VB中用Outlook发电子邮件 ◆ 115.htm 在WindowsNT网络中广播消息 ...
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工程指导...
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(扩展卡内存分配...
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#程序设计初学者,也可作为中、高级程序开发人员的参考手册。 ========...