网络编程
更新时间:2024-01-12 01:08:02 阅读量: 教育文库 文档下载
#include \#define BURRER_SIZE 65535 void main(int argc,char * argv[]) { // 判断输入的命令行格式是否正确 if (argc != 2) {
cout << \请按以下格式输入命令行: IPMonitor
duration_time\ << endl << \ 其中duration_time为监控时间, 单位为秒\ return;
}
WSADATA wsData;
// 初始化Winsock DLL
if (WSAStartup(MAKEWORD(2,2),&wsData) != 0) { cout << \ return;
}
// 创建Raw Socket
SOCKET sock;
if ( (sock = WSASocket(AF_INET, SOCK_RAW,
IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET ) { cout << \ return;
}
// 设置IP头操作选项,表示用户可以亲自对IP头进行处理
BOOL bFlag = TRUE; if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&bFlag, sizeof(bFlag)) == SOCKET_ERROR) { cout << \ return;
}
// 获取本地主机名
char pHostName[128];
if (gethostname(pHostName,
100)
==
SOCKET_ERROR) { cout << \
return;
}
// 通过本地主机名获取本地IP地址
hostent * pHostIP;
if((pHostIP =
gethostbyname(pHostName))
==
NULL) { cout<<\ 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_in,sizeof(addr_in)) == SOCKET_ERROR) { cout << \ return;
}
// 把网卡设置为混杂模式,以便接收所有的IP包
#define IO_RCVALL _WSAIOW(IOC_VENDOR,1) 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<<\
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);
// 输入参数
// 获得当前系统时间
}
cout << \数据包统计结果: (\IpList.print(cout); cout << endl; return;
秒)\
为捕获时间
// 输出本地IP地址 cout << endl;
cout << \本机IP:\
<< inet_ntoa(*(in_addr *)&(addr_in.sin_addr.S_un.S_addr)) << endl << endl; cout << \开始捕获...\
// 捕获经过网卡的IP数据包 int nPacketSize
=
while (1) { time(&end); // 获得当前系统时间 //如果捕获时间到,就结束捕获
if (end-beg >= dwDuration) { }
break;
recv(sock,pBuffer,BURRER_SIZE,0); 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); }
}
}
// 输出统计结果
// IPNode.cpp: implementation of the CIPNode class. //
//////////////////////////////////////////////////////////////////////
#include \
// Default constructor CIPNode::CIPNode() { }
// Default destructor CIPNode::~CIPNode() {
}
CIPNode::CIPNode(unsigned long dwSourIP,unsigned
long dwDestIP,unsigned char chPro)
{ m_dwSourIPAddr = dwSourIP;
m_dwDestIPAddr = dwDestIP;
m_chProtocol = chPro; m_dwCouter = 1; // 初始化数据包个数
为1 }
// 增加数据包的数量 void CIPNode::addCount() { m_dwCouter++;
}
// 取得数据包数量
unsigned long CIPNode::getCount() { return m_dwCouter; }
// 取得源IP地址
unsigned long CIPNode::getSourIPAddr() { return m_dwSourIPAddr;
}
// 取得目的IP地址
unsigned long CIPNode::getDestIPAddr() {
return m_dwDestIPAddr; }
// 取得协议类型
unsigned char CIPNode::getProtocol() { return m_chProtocol;
}
// 取得协议名称
char * CIPNode::getProtocol_String() { switch(m_chProtocol) {
case 1: return \ break; case 2: return \ break; case 4:
return \ break; case 6:
return \ break; case 8: return \ break; case 17:
return \
break;
case 41: return \ break; case 46:
return \ break; case 89: return \
break;
default: return \ }
}
// NodeList.cpp: implementation of the CNodeList class. //
////////////////////////////////////////////////////////////////////// #include \
// Default constructor CNodeList::CNodeList() { pHead = pTail = NULL;
}
// Default destructor
CNodeList::~CNodeList() { // 删除链表中所有结点 if (pHead != NULL) { CIPNode * pTemp = pHead; pHead = pHead->pNext; delete pTemp; }
}
// 把新捕获的IP数据包加入链表
void CNodeList::addNode(unsigned long dwSourIP,unsigned long dwDestIP,unsigned char chPro) { if (pHead == NULL) // 链表空
{
pTail = new
CIPNode(dwSourIP,dwDestIP,chPro); pHead = pTail;
pTail->pNext = NULL;
}
else // 链表不空时 {
CIPNode * pTemp;
for(pTemp = pHead; pTemp; pTemp = pTemp->pNext)
{ // 如果链表中已存在该类型的IP包,则数据包个数加1
if (pTemp->getSourIPAddr() == dwSourIP && pTemp->getDestIPAddr() == dwDestIP && pTemp->getProtocol() == chPro) {
// 数据包个数加1
pTemp->addCount();
break;
} } // 如果链表中不存在该类型的IP包,则创建新的结点加入链表 if (pTemp == NULL) { pTail->pNext =
new
CIPNode(dwSourIP,dwDestIP,chPro);
pTail = pTail->pNext; pTail->pNext = NULL;
}
}
}
// 输出链表
ostream& CNodeList::print(ostream & out) { CIPNode * pTemp; if(pHead == NULL) { out << \没有捕获到IP数据包!\
} else {
out << \源地址 \目的地址\<< \协议类型 \数据包数量\ for(pTemp = pHead; pTemp; pTemp = pTemp->pNext) {
unsigned
long dwSourTemp = pTemp->getSourIPAddr(); unsigned
long
dwDestTemp
=
pTemp->getDestIPAddr(); out << inet_ntoa(*(in_addr *)&(dwSourTemp)) << '\\t'; out << inet_ntoa(*(in_addr
*)&(dwDestTemp)) << '\\t'; out << resetiosflags(ios::right)
<<
setiosflags(ios::left)
<< setfill(' ') << setw(10) <<
pTemp->getProtocol_String() << resetiosflags(ios::left) << setiosflags(ios::right); out << pTemp->getCount() << endl;
}
}
return out;
}
正在阅读:
网络编程01-12
关于节日的成语大全04-05
护理学研究复习资料03-17
现代老年公寓功能研究03-10
让交流之花在课堂美丽绽放06-26
初中语文苏教版八年级上册第四单元第16课《小石潭记》优质课公开课教案教师资格证面试试讲教案03-13
明代家具01-06
2012年初中毕业班数学模拟试题(七)12-03
十大皮衣品牌品牌05-29
零部件走样管理规定(新)01-29
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 计算机网络三级理论题(1)
- 2018年安徽省中考英语试题及答案解析(Word版)
- 研究性学习课题结题报告
- 浅谈物理教学在高中新课程改革下的多种学习方式-最新教育资料
- 大物A(二)综合训练
- 一路花香
- 集成电路RC正弦波振荡器
- 2013高考猜题卷(数学 理)
- c语言作业资料
- 新庄煤矿简介
- 微机原理习题答案567 - 图文
- 第一章概论
- 剑桥雅思6-第一套口语P1P2P3真题+解析+答案范文
- 数学培优竞赛新方法五年级 - 整数的奇偶性
- 统计附表 - 图文
- 荣昌县人民政府电子公文
- 关于我校联合办学参加学成人教育学生大专毕业证情况的说明
- 起动电机前盖的机械加工及模具设计
- 人防地下室施工组织设计(1)
- 广东省佛山市中级人民法院审理企业破产案件规程