/* $Id: clientconnectiontcpudp.hpp,v 1.4.4.2 2006/03/09 14:59:42 chfreund Exp $ */ #ifndef _CLIENTCONNECTIONTCPUDP_HPP_ #define _CLIENTCONNECTIONTCPUDP_HPP_ #include #include #include #include "clientconnection.hpp" struct Message; struct EventMessage; struct EchoMessage; class World; class ClientConnectionTCP; //! A client connection using TCP and UDP class ClientConnectionTCPUDP : public ClientConnection { private: //! A TCP socket TCPsocket m_tcpSocket; //! A socket set for the TCP socket SDLNet_SocketSet m_tcpSocketSet; //! The client address to send UDP packets to IPaddress m_udpAddress; //! A range for local UDP ports Uint16 m_udpPortStart; Uint16 m_udpPortEnd; //! The local UDP port number Uint16 m_localUdpPort; //! A UDP socket UDPsocket m_udpSocket; //! A socket set for the UDP socket SDLNet_SocketSet m_udpSocketSet; //! UDP packet for incoming events UDPpacket* m_eventPacket; //! UDP packet for outgoing echos UDPpacket* m_echoPacket; //! UDP packet for outgoing sync notifications UDPpacket* m_syncPacket; //! The last event message received from the client EventMessage* m_eventMessage; //! Message queue for received messages std::deque m_messageQueue; //! Buffer for echo messages std::deque m_echoMessageBuffer; //! The maximal allowed lag of clients from server side static const Uint16 m_MAX_SERVER_LAG = 200; //! The last echo frame which has been definitely received by the client Uint32 m_lastReceivedFrame; //! The maximal allowed lag from client side before resending messages static const Uint16 m_MAX_CLIENT_LAG = 5; //! The lag from client side in counts of missing echo messages Uint32 m_clientLag; public: //! Constructor //! \param socket The already connected TCP socket ClientConnectionTCPUDP( TCPsocket tcpSocket ); //! Destructor virtual ~ClientConnectionTCPUDP(); ClientConnectionTCP* createClientConnectionTCP(); //! \name Implementations of the abstract functions of the base class //@{ void openConnection( Uint8 clientID ); void closeConnection(); bool checkUdpConnection(); bool isConnected() { return m_tcpSocket != 0; } EventMessage* getEventMessage(); Message* getMessage(); void sendMessage( Message* message ); void sendEchoMessage( Message* message ); //@} private: //! Receive messages from the TCP socket //! \return true, if messages were received, false else bool recvMessage(); //! Receive event messages from the UDP socket //! \return true, if messages were received, false else bool recvEventMessage(); }; #endif // _CLIENTCONNECTIONTCPUDP_HPP_