All pastes #30563 Raw Edit

Untitled

public text v1 · immutable
#30563 ·published 2005-11-23 14:34 UTC
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;
}