rendered paste body#include "stdafx.h"
#include "NetworkSniffer.h"
#include <stdio.h>
#include <winsock2.h>
NetworkSniffer::NetworkSniffer()
{
WSADATA wsaData;
error = WSAStartup(MAKEWORD(VERSION_MAJOR, VERSION_MINOR), &wsaData);
if(error)
{
error = NetworkSniffer::SE_WRONGWSOCK;
}
else if(LOBYTE(wsaData.wVersion) != VERSION_MAJOR || HIBYTE(wsaData.wVersion != VERSION_MINOR))
{
error = NetworkSniffer::SE_WRONGWSOCK;
WSACleanup();
}
}
NetworkSniffer::~NetworkSniffer()
{
closesocket(s);
WSACleanup();
}
int NetworkSniffer::init(char *localip)
{
DWORD dwBufferLen[10];
DWORD dwBufferInLen = 1;
DWORD dwBytesReturned = 0;
// look if the WinSock was inited properly
if(error != NetworkSniffer::SE_OK)
return error;
// set up listening to the network
s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if(s == INVALID_SOCKET)
return WSAGetLastError();
int rcvtimeout = 5000;
if(SOCKET_ERROR == setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&rcvtimeout, sizeof(rcvtimeout)))
return WSAGetLastError();
SOCKADDR_IN sa;
ZeroMemory(&sa, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_port = htons(7000);
sa.sin_addr.S_un.S_addr = inet_addr(localip); // inet_addr(localip);
// bind socket to a port
if(SOCKET_ERROR == bind(s, (LPSOCKADDR)&sa, sizeof(sa)))
return WSAGetLastError();
// receive all packets
if(SOCKET_ERROR == WSAIoctl(s, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL))
return WSAGetLastError();
/*
// set non-blocking
if(SOCKET_ERROR == WSAIoctl(s, FIONBIO, &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL))
return WSAGetLastError();
*/
return NetworkSniffer::SE_OK;
}
int NetworkSniffer::isAvailable()
{
DWORD bytesAvailable = 0;
ioctlsocket(s, FIONREAD, &bytesAvailable);
return bytesAvailable;
}
int NetworkSniffer::getData(char *buffer, unsigned int size)
{
int bytesReceived = 0;
if( (bytesReceived = recv(s, buffer, size, 0)) == SOCKET_ERROR)
return -WSAGetLastError();
else
return bytesReceived;
}