基于VC實(shí)現(xiàn)的網(wǎng)絡(luò)監(jiān)聽(tīng)功能程序?qū)嵗?/h1>
更新時(shí)間:2014年07月26日 16:00:39 投稿:shichen2014
這篇文章主要介紹了基于VC實(shí)現(xiàn)的網(wǎng)絡(luò)監(jiān)聽(tīng)功能程序,需要的朋友可以參考下
本文所述VC++網(wǎng)絡(luò)監(jiān)聽(tīng)器代碼,可以實(shí)現(xiàn)監(jiān)聽(tīng)網(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ù)報(bào)中的數(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ù)報(bào)總長(zhǎng)度
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é)議名稱(chēng)
ptemp = get_protoname(pHeadIP->proto);
strcpy(sourceip,ptemp);
pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,0,sourceip);
//獲取IP數(shù)據(jù)報(bào)總長(zhǎng)度
WORD ipSumLen = ntohs(pHeadIP->totallen);
//IP數(shù)據(jù)報(bào)頭總長(zhǎng)度
int ipHeadLen = 20;
//獲得去除IP層數(shù)據(jù)的長(zhǎng)度
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ù)報(bào)頭共4個(gè)字節(jié)
//獲取數(shù)據(jù)的長(zhǎng)度
netlen -= 4;
break;
}
case IPPROTO_UDP:
{
pHeadUDP = (HEADUDP*)(tempbuf+20);
pData = (BYTE*)pHeadUDP+8; //UDP數(shù)據(jù)報(bào)頭共8個(gè)字節(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ù)報(bào)頭共20個(gè)字節(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; //超時(shí)4秒
//設(shè)置接收數(shù)據(jù)的超時(shí)時(shí)間
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("地址綁定錯(cuò)誤");
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ū)錯(cuò)誤.");
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)行測(cè)試,加以改進(jìn)與完善之后整合進(jìn)自身項(xiàng)目中去。
您可能感興趣的文章:- VC動(dòng)態(tài)生成菜單項(xiàng)的實(shí)現(xiàn)方法
- VC實(shí)現(xiàn)ODBC數(shù)據(jù)庫(kù)操作實(shí)例解析
- VC++操作SQLite簡(jiǎn)單實(shí)例
- VC實(shí)現(xiàn)批量刪除指定文件的方法
- VC程序設(shè)計(jì)中CreateProcess用法注意事項(xiàng)
- VC6.0實(shí)現(xiàn)讀取Excel數(shù)據(jù)的方法
- VC小技巧匯總之5則實(shí)用小技巧
- VC小技巧匯總之窗口技巧
- VC小技巧匯總之控件技巧
- VC實(shí)現(xiàn)讓關(guān)閉按鈕成灰色不可用的方法
相關(guān)文章
-
VS中scanf函數(shù)報(bào)錯(cuò)問(wèn)題的幾種解決方法
本文主要介紹了VS中scanf函數(shù)報(bào)錯(cuò)問(wèn)題的幾種解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧 2023-07-07
-
C++ deque與vector對(duì)比的優(yōu)缺點(diǎn)
這篇文章主要介紹了C++中deque與vector相比的優(yōu)勢(shì)與劣勢(shì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧 2023-01-01
-
C++控制權(quán)限關(guān)鍵字protected
這篇文章主要介紹了C++控制權(quán)限關(guān)鍵字protected,protected和private類(lèi)似,而對(duì)于派生類(lèi)來(lái)說(shuō),protected與public類(lèi)似,下面來(lái)一起倆姐更多詳細(xì)內(nèi)容吧,需要的小伙伴可以參考一下 2022-01-01
-
C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(多文件)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2020-12-12
-
C/C++實(shí)現(xiàn)磁盤(pán)相關(guān)操作的示例代碼
這篇文章主要為大家詳細(xì)介紹了C/C++如何實(shí)現(xiàn)磁盤(pán)相關(guān)操作,例如遍歷磁盤(pán)容量、實(shí)現(xiàn)磁盤(pán)格式化、移除指定磁盤(pán)等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下 2023-11-11
-
C語(yǔ)言中實(shí)現(xiàn)自定義數(shù)據(jù)類(lèi)型的輸入輸出的方法和技巧
在 C 語(yǔ)言中,除了基本的數(shù)據(jù)類(lèi)型(如整型、浮點(diǎn)型、字符型等),我們還經(jīng)常需要自定義數(shù)據(jù)類(lèi)型來(lái)滿足特定的編程需求,所以本文給大家介紹了C語(yǔ)言中實(shí)現(xiàn)自定義數(shù)據(jù)類(lèi)型的輸入輸出的方法和技巧,需要的朋友可以參考下 2024-07-07
-
Linux下g++編譯與使用靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的方法
下面小編就為大家?guī)?lái)一篇Linux下g++編譯與使用靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧 2017-05-05
-
C/C++如何獲取當(dāng)前系統(tǒng)時(shí)間的實(shí)例詳解
這篇文章主要介紹了 C/C++如何獲取當(dāng)前系統(tǒng)時(shí)間的實(shí)例詳解的相關(guān)資料,這里提供了幾種實(shí)現(xiàn)方法,幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下 2017-08-08
-
C語(yǔ)言實(shí)現(xiàn)掃雷小游戲(適合初學(xué)者)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷小游戲,適合初學(xué)者練習(xí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2020-03-03
最新評(píng)論
本文所述VC++網(wǎng)絡(luò)監(jiān)聽(tīng)器代碼,可以實(shí)現(xiàn)監(jiān)聽(tīng)網(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ù)報(bào)中的數(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ù)報(bào)總長(zhǎng)度
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é)議名稱(chēng)
ptemp = get_protoname(pHeadIP->proto);
strcpy(sourceip,ptemp);
pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,0,sourceip);
//獲取IP數(shù)據(jù)報(bào)總長(zhǎng)度
WORD ipSumLen = ntohs(pHeadIP->totallen);
//IP數(shù)據(jù)報(bào)頭總長(zhǎng)度
int ipHeadLen = 20;
//獲得去除IP層數(shù)據(jù)的長(zhǎng)度
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ù)報(bào)頭共4個(gè)字節(jié)
//獲取數(shù)據(jù)的長(zhǎng)度
netlen -= 4;
break;
}
case IPPROTO_UDP:
{
pHeadUDP = (HEADUDP*)(tempbuf+20);
pData = (BYTE*)pHeadUDP+8; //UDP數(shù)據(jù)報(bào)頭共8個(gè)字節(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ù)報(bào)頭共20個(gè)字節(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; //超時(shí)4秒
//設(shè)置接收數(shù)據(jù)的超時(shí)時(shí)間
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("地址綁定錯(cuò)誤");
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ū)錯(cuò)誤.");
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)行測(cè)試,加以改進(jìn)與完善之后整合進(jìn)自身項(xiàng)目中去。
- VC動(dòng)態(tài)生成菜單項(xiàng)的實(shí)現(xiàn)方法
- VC實(shí)現(xiàn)ODBC數(shù)據(jù)庫(kù)操作實(shí)例解析
- VC++操作SQLite簡(jiǎn)單實(shí)例
- VC實(shí)現(xiàn)批量刪除指定文件的方法
- VC程序設(shè)計(jì)中CreateProcess用法注意事項(xiàng)
- VC6.0實(shí)現(xiàn)讀取Excel數(shù)據(jù)的方法
- VC小技巧匯總之5則實(shí)用小技巧
- VC小技巧匯總之窗口技巧
- VC小技巧匯總之控件技巧
- VC實(shí)現(xiàn)讓關(guān)閉按鈕成灰色不可用的方法
相關(guān)文章
VS中scanf函數(shù)報(bào)錯(cuò)問(wèn)題的幾種解決方法
本文主要介紹了VS中scanf函數(shù)報(bào)錯(cuò)問(wèn)題的幾種解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
C++ deque與vector對(duì)比的優(yōu)缺點(diǎn)
這篇文章主要介紹了C++中deque與vector相比的優(yōu)勢(shì)與劣勢(shì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-01-01
C++控制權(quán)限關(guān)鍵字protected
這篇文章主要介紹了C++控制權(quán)限關(guān)鍵字protected,protected和private類(lèi)似,而對(duì)于派生類(lèi)來(lái)說(shuō),protected與public類(lèi)似,下面來(lái)一起倆姐更多詳細(xì)內(nèi)容吧,需要的小伙伴可以參考一下2022-01-01
C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(多文件)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
C/C++實(shí)現(xiàn)磁盤(pán)相關(guān)操作的示例代碼
這篇文章主要為大家詳細(xì)介紹了C/C++如何實(shí)現(xiàn)磁盤(pán)相關(guān)操作,例如遍歷磁盤(pán)容量、實(shí)現(xiàn)磁盤(pán)格式化、移除指定磁盤(pán)等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
C語(yǔ)言中實(shí)現(xiàn)自定義數(shù)據(jù)類(lèi)型的輸入輸出的方法和技巧
在 C 語(yǔ)言中,除了基本的數(shù)據(jù)類(lèi)型(如整型、浮點(diǎn)型、字符型等),我們還經(jīng)常需要自定義數(shù)據(jù)類(lèi)型來(lái)滿足特定的編程需求,所以本文給大家介紹了C語(yǔ)言中實(shí)現(xiàn)自定義數(shù)據(jù)類(lèi)型的輸入輸出的方法和技巧,需要的朋友可以參考下2024-07-07
Linux下g++編譯與使用靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的方法
下面小編就為大家?guī)?lái)一篇Linux下g++編譯與使用靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
C/C++如何獲取當(dāng)前系統(tǒng)時(shí)間的實(shí)例詳解
這篇文章主要介紹了 C/C++如何獲取當(dāng)前系統(tǒng)時(shí)間的實(shí)例詳解的相關(guān)資料,這里提供了幾種實(shí)現(xiàn)方法,幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08
C語(yǔ)言實(shí)現(xiàn)掃雷小游戲(適合初學(xué)者)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷小游戲,適合初學(xué)者練習(xí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03

