18,356
社区成员
发帖
与我相关
我的任务
分享
#include "StdAfx.h"
#include "Sniffer.h"
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
#define BUFFER_SIZE 65535
char RecvBuf[BUFFER_SIZE];
UINT SniffThreadFun(LPVOID pParam);
void SignalHandler(int sig);
Sniffer::Sniffer(void)
: stopSniff(true)
{
}
Sniffer::~Sniffer(void)
{
}
bool Sniffer::InitSocket(void)
{
int err;
int sockOpt = 1;
char localName[100];
struct hostent *hostPtr;
SOCKADDR_IN sockAddr;
WORD versionRequired = MAKEWORD(1,1);
err = WSAStartup(versionRequired, &wsaData);
if(err == SOCKET_ERROR)
return false;
sockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if (sockRaw == INVALID_SOCKET)
return false;
err = setsockopt(sockRaw, IPPROTO_IP, IP_HDRINCL,
(char*)&sockOpt, sizeof(sockOpt));
if (err == SOCKET_ERROR)
return false;
err = gethostname(localName, sizeof(localName)-1);
if (err == SOCKET_ERROR)
return false;
hostPtr = gethostbyname(localName);
if (hostPtr == NULL)
return false;
sockAddr.sin_addr = *(in_addr *)hostPtr->h_addr_list[0];
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(57274);
err = bind(sockRaw, (PSOCKADDR)&sockAddr, sizeof(sockAddr));
if (err == SOCKET_ERROR)
return false;
return true;
}
bool Sniffer::StartSniff(void)
{
stopSniff = false;
int err;
unsigned long arg = 1;
err = ioctlsocket(sockRaw, SIO_RCVALL, &arg);
if (err == SOCKET_ERROR)
int errCode = WSAGetLastError();
return false;
AfxBeginThread(
(AFX_THREADPROC)SniffThreadFun,
(LPVOID)this,
THREAD_PRIORITY_NORMAL,
0, 0, NULL);
return true;
}
bool Sniffer::StopSniff(void)
{
stopSniff = true;
Sleep(2000);
int err;
DWORD arg = 0;
err = ioctlsocket(sockRaw, SIO_RCVALL, &arg);
if (err = SOCKET_ERROR)
return false;
return true;
}
void Sniffer::DisposeSocket(void)
{
WSACleanup();
closesocket(sockRaw);
}
UINT SniffThreadFun(LPVOID pParam)
{
Sniffer *snifferPtr = (Sniffer *)pParam;
while(!snifferPtr->stopSniff)
{
//执行recv的时候没有返回
if (recv(snifferPtr->sockRaw, RecvBuf, BUFFER_SIZE, 0))
{
snifferPtr->recvCallback(snifferPtr->pObserver, RecvBuf);
}
}
return 0;
}