#include "stdafx.h" #include "NetworkSniffer.h" #include #include 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; }