资源简介
计算机网络高级软件编程技术第5章 IP包流量分析程序源代码
代码片段和文件信息
#include “IPMonitor.h“
#define BURRER_SIZE 65535
void main(int argcchar * argv[])
{
// 判断输入的命令行格式是否正确
if (argc != 2)
{
cout << “请按以下格式输入命令行: IPMonitor duration_time“
<< endl << “ 其中duration_time为监控时间 单位为秒“< return;
}
WSADATA wsData;
// 初始化Winsock DLL
if (WSAStartup(MAKEWORD(22)&wsData) != 0)
{
cout << “WSAstartup failed!“ << endl;
return;
}
// 创建Raw Socket
SOCKET sock;
if ( (sock = WSASocket(AF_INET SOCK_RAW IPPROTO_IP NULL 0 WSA_FLAG_OVERLAPPED))
== INVALID_SOCKET )
{
cout << “Create socket failed!“ << endl;
return;
}
// 设置IP头操作选项,表示用户可以亲自对IP头进行处理
BOOL bFlag = TRUE;
if (setsockopt(sock IPPROTO_IP IP_HDRINCL (char *)&bFlag sizeof(bFlag)) == SOCKET_ERROR)
{
cout << “Setsockopt failed!“ << endl;
return;
}
// 获取本地主机名
char pHostName[128];
if (gethostname(pHostName 100) == SOCKET_ERROR)
{
cout << “Gethostname failed!“ << endl;
return;
}
// 通过本地主机名获取本地IP地址
hostent * pHostIP;
if((pHostIP = gethostbyname(pHostName)) == NULL)
{
cout<<“Gethostbyname failed!“< return;
}
// 填充sockaddr_in结构
sockaddr_in addr_in;
addr_in.sin_addr = *(in_addr *)pHostIP->h_addr_list[0]; // 设定IP地址
addr_in.sin_family = AF_INET; // 设定地址类型
addr_in.sin_port = htons(8000); // 设定端口
// 把原始套接字绑定到本机地址上
if(bind(sock(PSOCKADDR)&addr_insizeof(addr_in)) == SOCKET_ERROR)
{
cout << “Bind failed!“ << endl;
return;
}
// 把网卡设置为混杂模式,以便接收所有的IP包
#define IO_RCVALL _WSAIOW(IOC_VENDOR1)
unsigned long pBufferLen[10];
unsigned long dwBufferInLen = 1;
unsigned long dwBytesReturned = 0;
if ((WSAIoctl(sock IO_RCVALL &dwBufferInLen sizeof(dwBufferInLen) &pBufferLen
sizeof(pBufferLen) &dwBytesReturned NULL NULL)) == SOCKET_ERROR)
{
cout<<“Ioctlsocket failed!“< return;
}
// 把socket设置为非阻塞模式
unsigned long dwTemp = 1;
ioctlsocket(sock FIONBIO &dwTemp);
// 设置接收缓冲区
char pBuffer[BURRER_SIZE];
// 定义存放IP数据包的链表
CNodeList IpList;
double dwDuration = atof(argv[1]); // 输入参数为捕获时间
time_t beg;
time_t end;
time(&beg); // 获得当前系统时间
// 输出本地IP地址
cout << endl;
cout << “本机IP:“
<< inet_ntoa(*(in_addr *)&(addr_in.sin_addr.S_un.S_addr)) << endl << endl;
cout << “开始捕获...“ << endl << endl;
while (1)
{
time(&end); // 获得当前系统时间
//如果捕获时间到,就结束捕获
if (end-beg >= dwDuration)
{
break;
}
// 捕获经过网卡的IP数据包
int nPacketSize = recv(sockpBufferBURRER_SIZE0);
if (nPacketSize > 0)
{
IPHEADER * pIpHdr;
// 通过指针把缓冲区中的内容强制转换为IPHEADER数据结构
pIpHdr = (IPHEADER *)pBuffer;
// 判断IP包的源IP地址或目的IP地址是否为本地主机的IP地址
if (pIpHdr->SourceAddress == addr_in.sin_addr.S_un.S_addr
|| pIpHdr->DestAddress == addr_in.sin_addr.S_un.S_addr)
{
// 如果源IP地址或目的IP地址是本机IP,则将该IP数据包加入链表
IpList.addNode(pIpHdr->SourceAddress pIpHdr->DestAddress pIpHdr->Protocal);
}
}
}
// 输出统计结果
cout << “IP数据包统计结果: (“ << dwDuration << “ 秒)“
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3370 2007-06-15 08:44 第5章 IP包流量分析程序\IPMonitor\Code\IPMonitor.cpp
文件 4634 2007-06-15 09:15 第5章 IP包流量分析程序\IPMonitor\Code\IPMonitor.dsp
文件 541 2006-10-30 08:00 第5章 IP包流量分析程序\IPMonitor\Code\IPMonitor.dsw
文件 797 2007-06-15 08:54 第5章 IP包流量分析程序\IPMonitor\Code\IPMonitor.h
文件 140288 2007-06-27 16:23 第5章 IP包流量分析程序\IPMonitor\Code\IPMonitor.ncb
文件 54784 2007-06-27 16:23 第5章 IP包流量分析程序\IPMonitor\Code\IPMonitor.opt
文件 1457 2007-06-27 16:22 第5章 IP包流量分析程序\IPMonitor\Code\IPMonitor.plg
文件 1373 2007-06-15 09:06 第5章 IP包流量分析程序\IPMonitor\Code\IPNode.cpp
文件 1140 2007-06-15 09:14 第5章 IP包流量分析程序\IPMonitor\Code\IPNode.h
文件 2022 2007-06-15 09:14 第5章 IP包流量分析程序\IPMonitor\Code\NodeList.cpp
文件 902 2007-06-15 09:10 第5章 IP包流量分析程序\IPMonitor\Code\NodeList.h
文件 254090 2007-06-27 16:22 第5章 IP包流量分析程序\IPMonitor\Exe\IPMonitor.exe
文件 45568 2007-06-30 12:20 第5章 IP包流量分析程序\IPMonitor\使用说明.doc
文件 119 2010-05-20 15:07 第5章 IP包流量分析程序\我的空间.url
文件 125 2010-05-20 15:08 第5章 IP包流量分析程序\说明.url
目录 0 2010-05-20 15:07 第5章 IP包流量分析程序\IPMonitor\Code
目录 0 2010-05-20 15:07 第5章 IP包流量分析程序\IPMonitor\Exe
目录 0 2010-05-20 15:07 第5章 IP包流量分析程序\IPMonitor
目录 0 2010-05-20 15:08 第5章 IP包流量分析程序
----------- --------- ---------- ----- ----
511210 19
评论
共有 条评论