网络编程

更新时间: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;

}

本文来源:https://www.bwwdw.com/article/gwno.html

Top