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.Service(remotePort); 00022 00023 recvSocket = new wxDatagramSocket(local, wxSOCKET_NOWAIT); 00024 if (recvSocket->Error()) LOGERROR(wxT("<Tracking> Socket error while creating")); 00025 // this->recvSocket->SetEventHandler(*this, SocketHandlingID); 00026 // this->recvSocket->SetNotify(wxSOCKET_OUTPUT_FLAG | wxSOCKET_INPUT_FLAG | wxSOCKET_CONNECTION_FLAG| wxSOCKET_LOST_FLAG); 00027 // this->recvSocket->Notify(true); 00028 // this->Connect(wxEVT_SOCKET, wxSocketEventHandler(Receiver::ProcessEvtSocket), NULL, this); 00029 } 00030 Receiver::~Receiver() 00031 { 00032 delete [] packetBuffer; 00033 recvSocket->Destroy(); 00034 } 00035 void Receiver::UpdateSocket(wxString remoteAddr, unsigned short remotePort, unsigned short localPort) 00036 { 00037 recvSocket->Destroy(); 00038 local.AnyAddress(); 00039 local.Service(localPort); 00040 remote.Hostname(remoteAddr); 00041 remote.Service(remotePort); 00042 recvSocket = new wxDatagramSocket(local, wxSOCKET_NOWAIT); 00043 if (recvSocket->Error()) LOGERROR(wxT("<Tracking> Socket error while updating")); 00044 } 00045 bool Receiver::Receive() 00046 { 00047 //recvSocket->WaitForRead(0, 10); 00048 //recvSocket->SetTimeout(1); 00049 recvSocket->RecvFrom(remote, packetBuffer, packetMaxLength); 00050 packetLength = recvSocket->LastCount(); 00051 //LOGERROR(wxString::Format(wxT("<Tracking> Receive %i"), packetLength)); 00052 if (packetLength != 0) 00053 { 00054 if (packetLength > packetMaxLength){ LOGERROR(wxT("<Tracking> Too long datagram received!")); return false;}; 00055 if (packetLength == packetMaxLength){ LOGWARNING(wxT("<Tracking> Maximum amount of data on receiver buffer. Consider larger")); return false;}; 00056 packetBuffer[packetLength] = 0; 00057 return true; 00058 } 00059 /* if (recvSocket->Error()) 00060 LOGERROR(wxString::Format(wxT("<Tracking> Receive error %i"), recvSocket->LastError()));*/ 00061 return false; 00062 } 00063 void Receiver::ResizeBuffer(unsigned short length) 00064 { 00065 if (length != packetMaxLength) 00066 { 00067 packetMaxLength = length; 00068 delete [] packetBuffer; 00069 packetBuffer = new char[length + 1]; 00070 } 00071 }
1.5.5