Main Page | Modules | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | Related Pages | Examples

client.cpp

00001 /***************************************************************************
00002  * The contents of this file are subject to the Mozilla Public             *
00003  * License Version 1.1 (the "License"); you may not use this file          *
00004  * except in compliance with the License. You may obtain a copy of         *
00005  * the License at http://www.mozilla.org/MPL/                              *
00006  *                                                                         *
00007  * Software distributed under the License is distributed on an "AS         *
00008  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or              *
00009  * implied. See the License for the specific language governing            *
00010  * rights and limitations under the License.                               *
00011  *                                                                         *
00012  * The Original Code is Game Network Framework (GaNeF).                    *
00013  *                                                                         *
00014  * The Initial Developers of the Original Code are                         *
00015  * Lars Langer and Emanuel Greisen                                         *
00016  * Copyright (C) 2005. Lars Langer & Emanuel Greisen                       *
00017  * All Rights Reserved.                                                    *
00018  *                                                                         *
00019  * Contributor(s):                                                         *
00020  *   none yet....                                                          *
00021  *                                                                         *
00022  ***************************************************************************/
00023 #include "client.h"
00024 
00025 #include "serverpacket.h"
00026 #include "serverframework.h"
00027 
00028 #include <ptime.h>
00029 
00030 unsigned int Client::next_uid = 100;
00031 
00032 Client::Client(ServerFramework *fw, const ipaddress &addr, int port)
00033    : server_framework(fw),
00034       addr(addr),
00035       port(port),
00036       uid(next_uid++),
00037       state(NEWCLIENT),
00038       has_called_on_connect(false),
00039       has_called_on_disconnect(false),
00040       last_packet_received(msecs(now()))
00041 {
00042    //std::cout << "[Client addr: " << addr << ",port: " << port << std::endl;
00043 }
00044 
00045 
00046 Client::~Client()
00047 {
00048 }
00049 
00050 
00051 bool operator==(const Client & c1, const Client & c2)
00052 {
00053    return (c1.addr == c2.addr && c1.port == c2.port);
00054 }
00055 
00056 std::ostream & operator <<( std::ostream & o, Client & client )
00057 {
00058    return o << "[Client]" << client.getAddress() << ":" << client.getPort() << "[/Client]";
00059 }
00060 
00061 bool Client::isPacketReadyForDelivery( ServerPacket * packet )
00062 {
00063    if(packet->isReliable())
00064    {
00065       if(sequencenumbers.isNext(packet))
00066       {
00067          return true;
00068       }
00069       else if(sequencenumbers.isFuture(packet))
00070       {
00071          // Only enqueue future packets
00072          sequencenumbers.bufferPacket(packet);
00073       }
00074       else
00075       {
00076          // It's a duplicate
00077          //std::cout << "Discard duplicate reliable packet" << std::endl;
00078          delete packet;
00079       }
00080       return false;
00081    }
00082    else
00083    {
00084       if(packet->getSequenceNumber() >= sequencenumbers.getNextIngoingSeqNo(packet))
00085       {
00086          sequencenumbers.incrementNextIngoingSeqNo(packet);
00087          return true;
00088       }
00089       //std::cout << "Discard too old unreliable packet:" << packet->getSequenceNumber() << std::endl;
00090       delete packet;
00091       return false;
00092    }
00093 }
00094 
00095 ServerPacket * Client::incrementNextIngoingSeqNo( ServerPacket * packet )
00096 {
00097    //std::cout << "Client::incrementNextIngoingSeqNo( "<<packet->getSequenceNumber()<<")\n";
00098    return sequencenumbers.incrementNextIngoingSeqNo(packet);
00099 }
00100 
00101 unsigned int Client::getNextOutgoingPacketSeqNumber( ServerPacket * packet )
00102 {
00103    return sequencenumbers.getNextOutgoingSeqNo(packet);
00104 }

Generated on Mon Feb 6 12:24:50 2006 for Ganef by  doxygen 1.4.4