00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <net/NetServerTCP3Recv.h>
00022 #include <net/NetServerTCP3Coms.h>
00023 #include <net/NetMessagePool.h>
00024 #include <common/Logger.h>
00025
00026 NetServerTCP3Recv::NetServerTCP3Recv(
00027 TCPsocket socket,
00028 unsigned int destinationId, unsigned int ipAddress,
00029 NetMessageHandler *recieveMessageHandler) :
00030 socket_(socket),
00031 destinationId_(destinationId), ipAddress_(ipAddress),
00032 recieveMessageHandler_(recieveMessageHandler),
00033 messagesRecieved_(0), bytesIn_(0),
00034 stopped_(false), running_(true)
00035 {
00036 socketSet_ = SDLNet_AllocSocketSet(1);
00037 SDLNet_TCP_AddSocket(socketSet_, socket_);
00038 recvThread_ = SDL_CreateThread(
00039 NetServerTCP3Recv::recvThreadFunc, (void *) this);
00040 if (recvThread_ == 0)
00041 {
00042 Logger::log(
00043 "NetServerTCP3Recv: Failed to create recv thread");
00044 }
00045 }
00046
00047 NetServerTCP3Recv::~NetServerTCP3Recv()
00048 {
00049 SDLNet_FreeSocketSet(socketSet_);
00050 socketSet_ = 0;
00051 }
00052
00053 int NetServerTCP3Recv::recvThreadFunc(void *c)
00054 {
00055
00056 NetServerTCP3Recv *th = (NetServerTCP3Recv*) c;
00057 while (th->running_)
00058 {
00059 if (!th->actualRecvFunc()) break;
00060 SDL_Delay(100);
00061 }
00062 th->stopped_ = true;
00063 return 0;
00064 }
00065
00066 bool NetServerTCP3Recv::actualRecvFunc()
00067 {
00068
00069 int numready = SDLNet_CheckSockets(socketSet_, 100);
00070 if (numready == -1) return false;
00071 if (numready == 0) return true;
00072
00073
00074 char lenbuf[4];
00075 if (!NetServerTCP3Coms::SDLNet_TCP_Recv_Full(socket_, lenbuf, 4))
00076 {
00077 Logger::log(S3D::formatStringBuffer(
00078 "NetServerTCP3Recv: Read failed for length"));
00079 return false;
00080 }
00081 Uint32 len = SDLNet_Read32(lenbuf);
00082
00083
00084 if (len > 5000000 || len == 0)
00085 {
00086 Logger::log(S3D::formatStringBuffer(
00087 "NetServerTCP3Recv: Buffer was too large to recieve. Size %i.",
00088 len));
00089 return false;
00090 }
00091
00092
00093 NetMessage *buffer = NetMessagePool::instance()->
00094 getFromPool(NetMessage::BufferMessage,
00095 destinationId_, ipAddress_);
00096 buffer->getBuffer().allocate(len);
00097 buffer->getBuffer().setBufferUsed(len);
00098
00099
00100 if (!NetServerTCP3Coms::SDLNet_TCP_Recv_Full(socket_,
00101 buffer->getBuffer().getBuffer(),
00102 len))
00103 {
00104 Logger::log(S3D::formatStringBuffer(
00105 "NetServerTCP3Recv: Read failed for buffer"));
00106 NetMessagePool::instance()->addToPool(buffer);
00107 return false;
00108 }
00109
00110
00111 NetInterface::getBytesIn() += len;
00112 bytesIn_ += len;
00113 messagesRecieved_ ++;
00114 recieveMessageHandler_->addMessage(buffer);
00115
00116 return true;
00117 }
00118
00119 void NetServerTCP3Recv::wait()
00120 {
00121 int status;
00122 SDL_WaitThread(recvThread_, &status);
00123 }