diff --git a/PacketReader.cpp b/PacketReader.cpp new file mode 100644 --- /dev/null +++ b/PacketReader.cpp @@ -0,0 +1,63 @@ +/* + * $Id: PacketReader.cpp 54 2008-01-10 00:24:52Z mbroeker $ + * $URL: http://localhost/svn/cpp/qMonitor/trunk/PacketReader.cpp $ + */ + +#include + +PacketReader::PacketReader (int tm) +{ + timeout = tm; + + if ((p_socket = socket (PF_PACKET, SOCK_RAW, htons (ETH_P_ALL))) == -1) { + perror ("SocketException"); + throw std::runtime_error ("SocketException: root access required"); + } +} + +PacketReader::PacketReader (std::string filename) +{ + if ((p_socket = open (filename.c_str (), O_RDONLY)) == -1) { + throw std::runtime_error ("FileException"); + } + + timeout = -1; +} + +PacketReader::~PacketReader () +{ + close (p_socket); +} + +std::string PacketReader::read () +{ + static char s[IP_MAXPACKET + 1]; + int c; + + c =::read (p_socket, s, IP_MAXPACKET); + s[c] = 0; + return std::string (s, c); +} + +bool PacketReader::ready () +{ + if (p_socket) + return true; + + return false; +} + +bool PacketReader::dataAvailable () +{ + pollfd fdin; + int event = 1; + + fdin.fd = p_socket; + fdin.events = POLLIN; + fdin.revents = 0; + + if (poll (&fdin, event, timeout) > 0) + return true; + + return false; +}