📄 listener1.cpp
字号:
// Listener1.cpp: implementation of the CListener class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Netcap.h"
#include "Listener1.h"
#include "mstcpip.h"
#include <windows.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CListener::CListener()
{
m_bStop=TRUE;
m_sockRaw=0;
m_hThread=NULL;
}
CListener::~CListener()
{
if(!m_bStop)
StopListen();
}
BOOL CListener::StartListen()
{
DWORD dwThreadID;
do {
m_bStop=FALSE;
m_sockRaw = ::WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP,
NULL, 0, WSA_FLAG_OVERLAPPED);
if(m_sockRaw==INVALID_SOCKET)
break;
if(!BindSocket())
break;
DWORD dwVal=1;
DWORD dwBytesRet;
if(SOCKET_ERROR==WSAIoctl(m_sockRaw, SIO_RCVALL, &dwVal,
sizeof(dwVal), NULL, 0, &dwBytesRet, NULL, NULL))
break;
DWORD (WINAPI CListener:: *p1)()=ListenProc;
DWORD (WINAPI *P2)(LPVOID)=NULL;
memcpy(&P2, &p1, sizeof(p1));
m_hThread=::CreateThread(NULL, 0, P2, this, 0, &dwThreadID);
if(m_hThread==NULL)
break;
return TRUE;
} while(FALSE);
m_bStop=TRUE;
if(m_sockRaw)
{
closesocket(m_sockRaw);
m_sockRaw=0;
}
return FALSE;
}
void CListener::StopListen()
{
if(!m_bStop)
{
m_bStop=TRUE;
::TerminateThread(m_hThread, 0);
::WaitForSingleObject(m_hThread, INFINITE);
::CloseHandle(m_hThread);
::closesocket(m_sockRaw);
}
}
DWORD WINAPI CListener::ListenProc()
{
DWORD dwFlags;
DWORD dwBytesRead;
WSABUF wbuf;
char buf[0x1500];
wbuf.len=0x1500;
wbuf.buf=buf;
while(!m_bStop)
{
dwFlags=0;
::WSARecv(m_sockRaw, &wbuf, 1, &dwBytesRead, &dwFlags, NULL, NULL);
wbuf.len=dwBytesRead;
//等价于回调函数
::AfxGetMainWnd()->SendMessage(MSG_RECEIVE, 0, (LPARAM)&wbuf);
}
return 0;
}
BOOL CListener::BindSocket()
{
SOCKET_ADDRESS_LIST *Slist=NULL;
char buf[2048];
DWORD dwBytesRet;
SOCKADDR_IN if0;
if(SOCKET_ERROR==WSAIoctl(m_sockRaw, SIO_ADDRESS_LIST_QUERY,
NULL, 0, buf,2048, &dwBytesRet, NULL, NULL))
return (FALSE);
Slist = (SOCKET_ADDRESS_LIST *)buf;
if(Slist->iAddressCount<=0)
return (FALSE);
if0.sin_addr.s_addr=
((SOCKADDR_IN *)Slist->Address[0].lpSockaddr)->sin_addr.s_addr;
if0.sin_family = AF_INET;
if0.sin_port = htons(0);
if(SOCKET_ERROR == ::bind(m_sockRaw, (SOCKADDR *)&if0, sizeof(if0)))
return (FALSE);
return (TRUE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -