00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
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
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
00072 sequencenumbers.bufferPacket(packet);
00073 }
00074 else
00075 {
00076
00077
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
00090 delete packet;
00091 return false;
00092 }
00093 }
00094
00095 ServerPacket * Client::incrementNextIngoingSeqNo( ServerPacket * packet )
00096 {
00097
00098 return sequencenumbers.incrementNextIngoingSeqNo(packet);
00099 }
00100
00101 unsigned int Client::getNextOutgoingPacketSeqNumber( ServerPacket * packet )
00102 {
00103 return sequencenumbers.getNextOutgoingSeqNo(packet);
00104 }