00001 /* 00002 * $Id: receiver.cpp $ 00003 * 00004 * Description : UDP packet listener 00005 * Author : Radek Bien <mail: radek.bien@seznam.cz> <ICQ: 201-963-660> 00006 * 00007 * Purpose : 00008 * UDP packet receiver implementation file 00009 */ 00010 00011 #include "receiver.h" 00012 #include "../../core/src/flexilog.h" 00013 Receiver::Receiver(wxString remoteAddr, unsigned short remotePort, unsigned short localPort, unsigned bufferLength) 00014 { 00015 packetBuffer = new char[bufferLength + 1]; 00016 packetMaxLength = bufferLength; 00017 00018 local.AnyAddress(); 00019 local.Service(localPort); 00020 //remote.Hostname(remoteAddr); 00021 remote.AnyAddress(); 00022 remote.Service(remotePort); 00023 00024 recvSocket = new wxDatagramSocket(local, wxSOCKET_NOWAIT); 00025 if (recvSocket->Error()) LOGERROR(wxT("<Tracking> Socket error while creating")); 00026 // this->recvSocket->SetEventHandler(*this, SocketHandlingID); 00027 // this->recvSocket->SetNotify(wxSOCKET_OUTPUT_FLAG | wxSOCKET_INPUT_FLAG | wxSOCKET_CONNECTION_FLAG| wxSOCKET_LOST_FLAG); 00028 // this->recvSocket->Notify(true); 00029 // this->Connect(wxEVT_SOCKET, wxSocketEventHandler(Receiver::ProcessEvtSocket), NULL, this); 00030 } 00031 Receiver::~Receiver() 00032 { 00033 delete [] packetBuffer; 00034 recvSocket->Destroy(); 00035 } 00036 void Receiver::UpdateSocket(wxString remoteAddr, unsigned short remotePort, unsigned short localPort) 00037 { 00038 recvSocket->Destroy(); 00039 local.AnyAddress(); 00040 local.Service(localPort); 00041 //remote.Hostname(remoteAddr); 00042 remote.AnyAddress(); 00043 remote.Service(remotePort); 00044 00045 00046 recvSocket = new wxDatagramSocket(local, wxSOCKET_NOWAIT); 00047 if (recvSocket->Error()) LOGERROR(wxT("<Tracking> Socket error while updating")); 00048 LOGERROR(wxT("<Tracking> Socket recreated")); 00049 00050 } 00051 bool Receiver::Receive() 00052 { 00053 // recvSocket->WaitForRead(0, 10); 00054 // recvSocket->SetTimeout(1); 00055 00056 recvSocket->RecvFrom(remote, packetBuffer, packetMaxLength); 00057 packetLength = recvSocket->LastCount(); 00058 if (packetLength != 0) 00059 { 00060 if (packetLength > packetMaxLength){ LOGERROR(wxT("<Tracking> Too long datagram received!")); return false;}; 00061 if (packetLength == packetMaxLength){ LOGWARNING(wxT("<Tracking> Maximum amount of data on receiver buffer. Consider larger")); return false;}; 00062 packetBuffer[packetLength] = 0; 00063 return true; 00064 } 00065 // if (recvSocket->Error()){ LOGERROR(wxT("<Tracking> Socket Error - no data received.")); return false;} 00066 return false; 00067 } 00068 void Receiver::ResizeBuffer(unsigned short length) 00069 { 00070 if (length != packetMaxLength) 00071 { 00072 packetMaxLength = length; 00073 delete [] packetBuffer; 00074 packetBuffer = new char[length + 1]; 00075 } 00076 }
1.5.5