⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listener1.cpp

📁 一个关于sniffe嗅探的程序
💻 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 + -