基于VC實(shí)現(xiàn)的網(wǎng)絡(luò)監(jiān)聽功能程序?qū)嵗?/h1>
來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點(diǎn)擊: 次
本文所述VC++網(wǎng)絡(luò)監(jiān)聽器代碼,可以實(shí)現(xiàn)監(jiān)聽網(wǎng)絡(luò)連接所使用的協(xié)議、源IP地址、目標(biāo)IP地址等信息的功能,并且能把數(shù)據(jù)內(nèi)容綁定到網(wǎng)格控件中顯示。具體功能代碼部分如下所示:
//線程函數(shù)
UINT ThreadFun( LPVOID pParam )
{
CSniffAppDlg* pDlg = static_cast<CSniffAppDlg*>(pParam);
MSG msg;
char buffer[1000],sourceip[32] ,*tempbuf;
char *ptemp;
BYTE* pData = NULL; //實(shí)際數(shù)據(jù)報中的數(shù)據(jù)
UINT sourceport ;
CString str;
HEADIP* pHeadIP;
HEADICMP* pHeadICMP;
HEADUDP* pHeadUDP;
HEADTCP* pHeadTCP;
in_addr addr;
int ret;
while (TRUE)
{
pData = NULL;
if (PeekMessage(&msg,pDlg->m_hWnd,WM_CLOSE,WM_CLOSE,PM_NOREMOVE ))
{
closesocket(pDlg->m_Sock);
break;
}
memset(buffer,0,1000);
ret = recv(pDlg->m_Sock,buffer,1000,0);
if (ret == SOCKET_ERROR)
{
continue;
}
else //接收到數(shù)據(jù)
{
tempbuf = buffer;
pHeadIP = (HEADIP*)tempbuf;
//獲取數(shù)據(jù)報總長度
WORD len = ntohs(pHeadIP->totallen);
//獲取源IP
pDlg->m_List.InsertItem(pDlg->m_List.GetItemCount(),"");
addr.S_un.S_addr = pHeadIP->sourceIP;
ptemp = inet_ntoa(addr);
pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,1,ptemp);
//獲取目的IP
addr.S_un.S_addr = pHeadIP->destIP;
ptemp = inet_ntoa(addr);
pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,2,ptemp);
//獲取協(xié)議名稱
ptemp = get_protoname(pHeadIP->proto);
strcpy(sourceip,ptemp);
pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,0,sourceip);
//獲取IP數(shù)據(jù)報總長度
WORD ipSumLen = ntohs(pHeadIP->totallen);
//IP數(shù)據(jù)報頭總長度
int ipHeadLen = 20;
//獲得去除IP層數(shù)據(jù)的長度
WORD netlen = ipSumLen - ipHeadLen;
//根據(jù)不同大協(xié)議獲得不同協(xié)議的數(shù)據(jù)
switch (pHeadIP->proto)
{
case IPPROTO_ICMP:
{
pHeadICMP = (HEADICMP*)(tempbuf+20);
pData = (BYTE*)(pHeadICMP)+4; //ICMP數(shù)據(jù)報頭共4個字節(jié)
//獲取數(shù)據(jù)的長度
netlen -= 4;
break;
}
case IPPROTO_UDP:
{
pHeadUDP = (HEADUDP*)(tempbuf+20);
pData = (BYTE*)pHeadUDP+8; //UDP數(shù)據(jù)報頭共8個字節(jié)
sourceport = ntohs(pHeadUDP->SourcePort);
str.Format("%d",sourceport);
//設(shè)置源端口
pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,3,str);
str.Empty();
netlen -= 8;
break;
}
case IPPROTO_TCP:
{
pHeadTCP = (HEADTCP*)(tempbuf+20);
sourceport = ntohs(pHeadTCP->SourcePort);
pData = (BYTE*)pHeadTCP+20; //TCP數(shù)據(jù)報頭共20個字節(jié)
str.Format("%d",sourceport);
//設(shè)置源端口
pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,3,str);
str.Empty();
netlen-= 20;
break;
}
}
//設(shè)置數(shù)據(jù)大小
str.Format("%d",netlen);
pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,4,str);
str.Empty();
//設(shè)置數(shù)據(jù)
if (pData != NULL)
{
str.Format(" %s",pData);
pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,5,str);
}
str.Empty();
}
}
return 0;
}
void CSniffAppDlg::OnBeginlisten()
{
//創(chuàng)建套接字
m_Sock = socket(AF_INET,SOCK_RAW, IPPROTO_IP );
char name[128];
memset(name,0,128);
hostent* phostent;
phostent = gethostbyname(name);
DWORD ip;
ip = inet_addr(inet_ntoa(*(in_addr*)phostent->h_addr_list[0]));
int timeout = 4000; //超時4秒
//設(shè)置接收數(shù)據(jù)的超時時間
setsockopt(m_Sock,SOL_SOCKET,SO_RCVTIMEO,(const char*)&timeout,sizeof(timeout));
sockaddr_in skaddr;
skaddr.sin_family = AF_INET;
skaddr.sin_port = htons(700);
skaddr.sin_addr.S_un.S_addr = ip;
//綁定地址
if ( bind(m_Sock,(sockaddr*)&skaddr,sizeof(skaddr))==SOCKET_ERROR)
{
MessageBox("地址綁定錯誤");
return;
}
DWORD inBuffer=1;
DWORD outBuffer[10];
DWORD reValue = 0;
if (WSAIoctl(m_Sock,SIO_RCVALL,&inBuffer,sizeof(inBuffer),&outBuffer,sizeof(outBuffer),&reValue,NULL,NULL)==SOCKET_ERROR)
{
MessageBox("設(shè)置緩沖區(qū)錯誤.");
closesocket(m_Sock);
return;
}
else
m_pThread = AfxBeginThread(ThreadFun,(void*)this);
}
void CSniffAppDlg::OnCancel()
{
if (m_pThread)
{
//m_pThread->ExitInstance();
delete m_pThread;
}
closesocket( m_Sock) ;
CDialog::OnCancel();
}
該實(shí)例只是功能部分主要代碼,讀者可根據(jù)自身項(xiàng)目需求進(jìn)行測試,加以改進(jìn)與完善之后整合進(jìn)自身項(xiàng)目中去。
本文所述VC++網(wǎng)絡(luò)監(jiān)聽器代碼,可以實(shí)現(xiàn)監(jiān)聽網(wǎng)絡(luò)連接所使用的協(xié)議、源IP地址、目標(biāo)IP地址等信息的功能,并且能把數(shù)據(jù)內(nèi)容綁定到網(wǎng)格控件中顯示。具體功能代碼部分如下所示:
//線程函數(shù) UINT ThreadFun( LPVOID pParam ) { CSniffAppDlg* pDlg = static_cast<CSniffAppDlg*>(pParam); MSG msg; char buffer[1000],sourceip[32] ,*tempbuf; char *ptemp; BYTE* pData = NULL; //實(shí)際數(shù)據(jù)報中的數(shù)據(jù) UINT sourceport ; CString str; HEADIP* pHeadIP; HEADICMP* pHeadICMP; HEADUDP* pHeadUDP; HEADTCP* pHeadTCP; in_addr addr; int ret; while (TRUE) { pData = NULL; if (PeekMessage(&msg,pDlg->m_hWnd,WM_CLOSE,WM_CLOSE,PM_NOREMOVE )) { closesocket(pDlg->m_Sock); break; } memset(buffer,0,1000); ret = recv(pDlg->m_Sock,buffer,1000,0); if (ret == SOCKET_ERROR) { continue; } else //接收到數(shù)據(jù) { tempbuf = buffer; pHeadIP = (HEADIP*)tempbuf; //獲取數(shù)據(jù)報總長度 WORD len = ntohs(pHeadIP->totallen); //獲取源IP pDlg->m_List.InsertItem(pDlg->m_List.GetItemCount(),""); addr.S_un.S_addr = pHeadIP->sourceIP; ptemp = inet_ntoa(addr); pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,1,ptemp); //獲取目的IP addr.S_un.S_addr = pHeadIP->destIP; ptemp = inet_ntoa(addr); pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,2,ptemp); //獲取協(xié)議名稱 ptemp = get_protoname(pHeadIP->proto); strcpy(sourceip,ptemp); pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,0,sourceip); //獲取IP數(shù)據(jù)報總長度 WORD ipSumLen = ntohs(pHeadIP->totallen); //IP數(shù)據(jù)報頭總長度 int ipHeadLen = 20; //獲得去除IP層數(shù)據(jù)的長度 WORD netlen = ipSumLen - ipHeadLen; //根據(jù)不同大協(xié)議獲得不同協(xié)議的數(shù)據(jù) switch (pHeadIP->proto) { case IPPROTO_ICMP: { pHeadICMP = (HEADICMP*)(tempbuf+20); pData = (BYTE*)(pHeadICMP)+4; //ICMP數(shù)據(jù)報頭共4個字節(jié) //獲取數(shù)據(jù)的長度 netlen -= 4; break; } case IPPROTO_UDP: { pHeadUDP = (HEADUDP*)(tempbuf+20); pData = (BYTE*)pHeadUDP+8; //UDP數(shù)據(jù)報頭共8個字節(jié) sourceport = ntohs(pHeadUDP->SourcePort); str.Format("%d",sourceport); //設(shè)置源端口 pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,3,str); str.Empty(); netlen -= 8; break; } case IPPROTO_TCP: { pHeadTCP = (HEADTCP*)(tempbuf+20); sourceport = ntohs(pHeadTCP->SourcePort); pData = (BYTE*)pHeadTCP+20; //TCP數(shù)據(jù)報頭共20個字節(jié) str.Format("%d",sourceport); //設(shè)置源端口 pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,3,str); str.Empty(); netlen-= 20; break; } } //設(shè)置數(shù)據(jù)大小 str.Format("%d",netlen); pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,4,str); str.Empty(); //設(shè)置數(shù)據(jù) if (pData != NULL) { str.Format(" %s",pData); pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,5,str); } str.Empty(); } } return 0; } void CSniffAppDlg::OnBeginlisten() { //創(chuàng)建套接字 m_Sock = socket(AF_INET,SOCK_RAW, IPPROTO_IP ); char name[128]; memset(name,0,128); hostent* phostent; phostent = gethostbyname(name); DWORD ip; ip = inet_addr(inet_ntoa(*(in_addr*)phostent->h_addr_list[0])); int timeout = 4000; //超時4秒 //設(shè)置接收數(shù)據(jù)的超時時間 setsockopt(m_Sock,SOL_SOCKET,SO_RCVTIMEO,(const char*)&timeout,sizeof(timeout)); sockaddr_in skaddr; skaddr.sin_family = AF_INET; skaddr.sin_port = htons(700); skaddr.sin_addr.S_un.S_addr = ip; //綁定地址 if ( bind(m_Sock,(sockaddr*)&skaddr,sizeof(skaddr))==SOCKET_ERROR) { MessageBox("地址綁定錯誤"); return; } DWORD inBuffer=1; DWORD outBuffer[10]; DWORD reValue = 0; if (WSAIoctl(m_Sock,SIO_RCVALL,&inBuffer,sizeof(inBuffer),&outBuffer,sizeof(outBuffer),&reValue,NULL,NULL)==SOCKET_ERROR) { MessageBox("設(shè)置緩沖區(qū)錯誤."); closesocket(m_Sock); return; } else m_pThread = AfxBeginThread(ThreadFun,(void*)this); } void CSniffAppDlg::OnCancel() { if (m_pThread) { //m_pThread->ExitInstance(); delete m_pThread; } closesocket( m_Sock) ; CDialog::OnCancel(); }
該實(shí)例只是功能部分主要代碼,讀者可根據(jù)自身項(xiàng)目需求進(jìn)行測試,加以改進(jìn)與完善之后整合進(jìn)自身項(xiàng)目中去。
上一篇:C++實(shí)現(xiàn)inline hook的原理及應(yīng)用實(shí)例
欄 目:C語言
下一篇:C++實(shí)現(xiàn)順序排序算法簡單示例代碼
本文標(biāo)題:基于VC實(shí)現(xiàn)的網(wǎng)絡(luò)監(jiān)聽功能程序?qū)嵗?/a>
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3527.html
您可能感興趣的文章
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10c語言求1+2+...+n的解決方法
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入理解約瑟夫環(huán)的數(shù)學(xué)優(yōu)化方法
- 01-10深入二叉樹兩個結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計- 解析最少換車次數(shù)的問題詳解
- 01-10c語言 跳臺階問題的解決方法
- 01-10如何判斷一個數(shù)是否為2的冪次方?若是,并判斷出來是多少次方


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文