資源簡介
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:?“?< 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?“?< ?<“?[“?< ?<“?with?a?maximum?of?“?< }
else?//解析主機名失敗
{
cerr?<“\nCould?not?resolve?the?host?name?“?< ?<“error?code:?“?< WSACleanup();
return?-1;
}
}
else
{
//輸出屏幕信息
cout?<“\nTracing?route?to?“?< ?<“?with?a?maximum?of?“?< }
//填充目的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:?“?< 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:?“?< 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:?“?< 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
評論
共有 條評論