00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "Aria.h"
00027 #include "ArExport.h"
00028 #include "ArNetPacketReceiverUdp.h"
00029 #ifndef WIN32
00030 #include <errno.h>
00031 #endif
00032
00033 AREXPORT ArNetPacketReceiverUdp::ArNetPacketReceiverUdp()
00034 {
00035 mySocket = NULL;
00036 myProcessPacketCB = NULL;
00037
00038
00039
00040 myPacket.setBuf(myBuff, sizeof(myBuff));
00041 }
00042
00043 AREXPORT ArNetPacketReceiverUdp::~ArNetPacketReceiverUdp()
00044 {
00045
00046 }
00047
00054 AREXPORT void ArNetPacketReceiverUdp::setSocket(ArSocket *socket)
00055 {
00056 mySocket = socket;
00057 }
00058
00063 AREXPORT ArSocket *ArNetPacketReceiverUdp::getSocket(void)
00064 {
00065 return mySocket;
00066 }
00067
00068
00072 AREXPORT void ArNetPacketReceiverUdp::setProcessPacketCB(
00073 ArFunctor2<ArNetPacket *, struct sockaddr_in *> *functor)
00074 {
00075 myProcessPacketCB = functor;
00076 }
00077
00081 AREXPORT ArFunctor2<ArNetPacket *, struct sockaddr_in *> *ArNetPacketReceiverUdp::getProcessPacketCB(void)
00082 {
00083 return myProcessPacketCB;
00084 }
00085
00086 AREXPORT bool ArNetPacketReceiverUdp::readData(void)
00087 {
00088 int ret;
00089 int packetLength;
00090 struct sockaddr_in sin;
00091
00092 if (mySocket == NULL)
00093 {
00094 ArLog::log(ArLog::Verbose, "NULL Udp Socket");
00095 return false;
00096 }
00097
00098 while ((ret = mySocket->recvFrom(myBuff, sizeof(myBuff), &sin)) > 0)
00099 {
00100 packetLength = (myBuff[3] << 8) | myBuff[2] & 0xff;
00101 if (ret != packetLength)
00102 fprintf(stderr, "packet length %d not equal to udp packet length %d",
00103 packetLength, ret);
00104 myPacket.setLength(packetLength);
00105 myPacket.setBuf(myBuff, sizeof(myBuff));
00106 if (myPacket.verifyCheckSum())
00107 {
00108 myPacket.resetRead();
00109
00110
00111
00112
00113
00114
00115
00116 myPacket.resetRead();
00117 if (myProcessPacketCB != NULL)
00118 {
00119 myPacket.setPacketSource(ArNetPacket::UDP);
00120 myProcessPacketCB->invoke(&myPacket, &sin);
00121 }
00122 }
00123 else
00124 {
00125 myPacket.resetRead();
00126 ArLog::log(ArLog::Normal,
00127 "ArNetPacketReceiverUdp::receivePacket: bad packet, bad checksum on packet %d", myPacket.getCommand());
00128 }
00129
00130 }
00131
00132
00133
00134
00135
00136 if (ret < 0)
00137 {
00138 #ifdef WIN32
00139 if (WSAGetLastError() == WSAEWOULDBLOCK || WSAGetLastError() == WSAECONNRESET)
00140 return true;
00141 else
00142 ArLog::log(ArLog::Terse, "Failed on read UDP, error %d", WSAGetLastError());
00143 #endif
00144 #ifndef WIN32
00145 if (errno == EAGAIN)
00146 return true;
00147 else
00148 ArLog::log(ArLog::Terse, "Failed on read UDP, error %d", errno);
00149 #endif
00150 ArLog::log(ArLog::Terse, "Failed on the udp read");
00151 return false;
00152 }
00153 else if (ret == 0)
00154 {
00155 printf("Read 0 byte UDP packet\n");
00156 return true;
00157 }
00158
00159 return true;
00160
00161 }