资源简介
tracert代码,根据具体的tracert原理,完成的网络编程,时效,有利于学习
代码片段和文件信息
/*----------------------------------------------------------
功能说明:该程序简单实现了Windows操作系统的tracert命令功能,
可以输出IP报文从本机出发到达目的主机所经过的路由信息。
注意:程序编译时应使用1字节对齐方式调整边界!
-----------------------------------------------------------*/
#include
#include
#include
#include
#include “itracert.h“
////////////////////////////////////////////////////////
int main(int argc char* argv[])
{
//检查命令行参数
if (argc != 2)
{
cerr << “\nUsage: itracert ip_or_hostname\n“;
return -1;
}
//初始化winsock2环境
WSADATA wsa;
if (WSAStartup(MAKEWORD(2 2) &wsa) != 0)
{
cerr << “\nFailed to initialize the WinSock2 DLL\n“
<< “error code: “ << WSAGetLastError() << endl;
return -1;
}
//将命令行参数转换为IP地址
u_long ulDestIP = inet_addr(argv[1]);
if (ulDestIP == INADDR_NONE)
{
//转换不成功时按域名解析
hostent* pHostent = gethostbyname(argv[1]);
if (pHostent)
{
ulDestIP = (*(in_addr*)pHostent->h_addr).s_addr;
//输出屏幕信息
cout << “\nTracing route to “ << argv[1]
<< “ [“ << inet_ntoa(*(in_addr*)(&ulDestIP)) << “]“
<< “ with a maximum of “ << DEF_MAX_HOP << “ hops.\n“ << endl;
}
else //解析主机名失败
{
cerr << “\nCould not resolve the host name “ << argv[1] << ‘\n‘
<< “error code: “ << WSAGetLastError() << endl;
WSACleanup();
return -1;
}
}
else
{
//输出屏幕信息
cout << “\nTracing route to “ << argv[1]
<< “ with a maximum of “ << DEF_MAX_HOP << “ hops.\n“ << endl;
}
//填充目的Socket地址
sockaddr_in destSockAddr;
ZeroMemory(&destSockAddr sizeof(sockaddr_in));
destSockAddr.sin_family = AF_INET;
destSockAddr.sin_addr.s_addr = ulDestIP;
//使用ICMP协议创建Raw Socket
SOCKET sockRaw = WSASocket(AF_INET SOCK_RAW IPPROTO_ICMP NULL 0 WSA_FLAG_OVERLAPPED);
if (sockRaw == INVALID_SOCKET)
{
cerr << “\nFailed to create a raw socket\n“
<< “error code: “ << WSAGetLastError() << endl;
WSACleanup();
return -1;
}
//设置端口属性
int iTimeout = DEF_ICMP_TIMEOUT;
if (setsockopt(sockRaw SOL_SOCKET SO_RCVTIMEO (char*)&iTimeout sizeof(iTimeout)) == SOCKET_ERROR)
{
cerr << “\nFailed to set recv timeout\n“
<< “error code: “ << WSAGetLastError() << endl;
closesocket(sockRaw);
WSACleanup();
return -1;
}
if (setsockopt(sockRaw SOL_SOCKET SO_SNDTIMEO (char*)&iTimeout sizeof(iTimeout)) == SOCKET_ERROR)
{
cerr << “\nFailed to set send timeout\n“
<< “error code: “ << WSAGetLastError() << endl;
closesocket(sockRaw);
WSACleanup();
return -1;
}
//创建ICMP包发送缓冲区和接收缓冲区
char IcmpSendBuf[sizeof(ICMP_HEADER)+DEF_ICMP_DATA_SIZE];
memset(IcmpSendBuf 0 sizeof(IcmpSendBuf));
char IcmpRecvBuf[MAX_ICMP_PACKET_SIZE];
memset(IcmpRecvBuf 0 sizeof(IcmpRecvBuf));
//填充待发送的ICMP包
ICMP_HEADER* pIcmpHeader = (ICMP_HEADER*)IcmpSendBuf;
pIcmpHeader->type = ICMP_ECHO_REQUEST;
pIcmpHeader->code = 0;
pIcmpHeader->id = (USHORT)GetCurrentProcessId();
memset(IcmpSendBuf+sizeof(ICMP_HEADE
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2013-06-11 18:40 第6章 Tracert程序\
目录 0 2013-06-11 18:42 第6章 Tracert程序\itracert\
目录 0 2013-06-11 18:40 第6章 Tracert程序\itracert\Code\
文件 7467 2007-06-28 16:19 第6章 Tracert程序\itracert\Code\itracert.cpp
文件 4413 2007-06-28 16:19 第6章 Tracert程序\itracert\Code\itracert.dsp
文件 541 2007-02-12 16:05 第6章 Tracert程序\itracert\Code\itracert.dsw
文件 1515 2007-02-13 23:10 第6章 Tracert程序\itracert\Code\itracert.h
文件 66560 2007-06-28 16:38 第6章 Tracert程序\itracert\Code\itracert.ncb
文件 100352 2007-06-28 16:38 第6章 Tracert程序\itracert\Code\itracert.opt
文件 1501 2007-06-28 16:37 第6章 Tracert程序\itracert\Code\itracert.plg
目录 0 2013-06-11 18:42 第6章 Tracert程序\itracert_icmpdll\
目录 0 2013-06-11 18:40 第6章 Tracert程序\itracert_icmpdll\Code\
文件 5068 2007-06-26 13:27 第6章 Tracert程序\itracert_icmpdll\Code\itracert_icmpdll.cpp
文件 4402 2007-05-03 12:05 第6章 Tracert程序\itracert_icmpdll\Code\itracert_icmpdll.dsp
文件 555 2007-05-03 10:24 第6章 Tracert程序\itracert_icmpdll\Code\itracert_icmpdll.dsw
文件 50176 2007-06-27 17:31 第6章 Tracert程序\itracert_icmpdll\Code\itracert_icmpdll.ncb
文件 100352 2007-06-27 17:31 第6章 Tracert程序\itracert_icmpdll\Code\itracert_icmpdll.opt
文件 1559 2007-06-27 17:30 第6章 Tracert程序\itracert_icmpdll\Code\itracert_icmpdll.plg
文件 26624 2007-06-29 13:31 第6章 Tracert程序\使用说明.doc
- 上一篇:载波相位测量
- 下一篇:WEB数据库实验报告8
评论
共有 条评论