modifying the protocol system to have bon synchronous and asynchronous updates (required by gui and graphics to avoid crashes because of threads)
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/hilnius@13246 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
72dd260bd1
commit
3bb6122f8e
@ -19,6 +19,7 @@ void NetworkWorld::update(float dt)
|
|||||||
ProtocolManager::getInstance()->getProtocol(PROTOCOL_SYNCHRONIZATION));
|
ProtocolManager::getInstance()->getProtocol(PROTOCOL_SYNCHRONIZATION));
|
||||||
if (protocol) // if this protocol exists, that's that we play online
|
if (protocol) // if this protocol exists, that's that we play online
|
||||||
{
|
{
|
||||||
|
Log::info("NetworkWorld", "Coutdown value is %d", protocol->getCountdown());
|
||||||
if (protocol->getCountdown() > 0)
|
if (protocol->getCountdown() > 0)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -90,9 +90,13 @@ class Protocol
|
|||||||
*/
|
*/
|
||||||
virtual void unpause();
|
virtual void unpause();
|
||||||
/*!
|
/*!
|
||||||
* \brief Called by the protocol listener as often as possible. Must be re-defined.
|
* \brief Called by the protocol listener, synchronously with the main loop. Must be re-defined.
|
||||||
*/
|
*/
|
||||||
virtual void update() = 0;
|
virtual void update() = 0;
|
||||||
|
/*!
|
||||||
|
* \brief Called by the protocol listener as often as possible. Must be re-defined.
|
||||||
|
*/
|
||||||
|
virtual void asynchronousUpdate() = 0;
|
||||||
/*!
|
/*!
|
||||||
* \brief Called when the protocol is to be killed.
|
* \brief Called when the protocol is to be killed.
|
||||||
*/
|
*/
|
||||||
|
@ -38,6 +38,16 @@ void* protocolManagerUpdate(void* data)
|
|||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
void* protocolManagerAsynchronousUpdate(void* data)
|
||||||
|
{
|
||||||
|
ProtocolManager* manager = static_cast<ProtocolManager*>(data);
|
||||||
|
while(!manager->exit())
|
||||||
|
{
|
||||||
|
manager->asynchronousUpdate();
|
||||||
|
irr_driver->getDevice()->sleep(20);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ProtocolManager::ProtocolManager()
|
ProtocolManager::ProtocolManager()
|
||||||
{
|
{
|
||||||
@ -50,12 +60,15 @@ ProtocolManager::ProtocolManager()
|
|||||||
|
|
||||||
|
|
||||||
pthread_mutex_lock(&m_exit_mutex); // will let the update function run
|
pthread_mutex_lock(&m_exit_mutex); // will let the update function run
|
||||||
/// NOT USED on client but updated in main loop (because of GUI crash)
|
/// FIXME used on server because mainloop never running
|
||||||
if (NetworkManager::getInstance()->isServer())
|
if (NetworkManager::getInstance()->isServer())
|
||||||
{
|
{
|
||||||
m_update_thread = (pthread_t*)(malloc(sizeof(pthread_t)));
|
m_update_thread = (pthread_t*)(malloc(sizeof(pthread_t)));
|
||||||
pthread_create(m_update_thread, NULL, protocolManagerUpdate, this);
|
pthread_create(m_update_thread, NULL, protocolManagerUpdate, this);
|
||||||
}
|
}
|
||||||
|
// always run this one
|
||||||
|
m_asynchronous_update_thread = (pthread_t*)(malloc(sizeof(pthread_t)));
|
||||||
|
pthread_create(m_asynchronous_update_thread, NULL, protocolManagerAsynchronousUpdate, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
ProtocolManager::~ProtocolManager()
|
ProtocolManager::~ProtocolManager()
|
||||||
@ -274,6 +287,18 @@ void ProtocolManager::propagateEvent(Event* event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ProtocolManager::update()
|
void ProtocolManager::update()
|
||||||
|
{
|
||||||
|
// now update all protocols
|
||||||
|
pthread_mutex_lock(&m_protocols_mutex);
|
||||||
|
for (unsigned int i = 0; i < m_protocols.size(); i++)
|
||||||
|
{
|
||||||
|
if (m_protocols[i].state == PROTOCOL_STATE_RUNNING)
|
||||||
|
m_protocols[i].protocol->update();
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&m_protocols_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProtocolManager::asynchronousUpdate()
|
||||||
{
|
{
|
||||||
// before updating, notice protocols that they have received information
|
// before updating, notice protocols that they have received information
|
||||||
int size = m_events_to_process.size();
|
int size = m_events_to_process.size();
|
||||||
@ -287,16 +312,17 @@ void ProtocolManager::update()
|
|||||||
propagateEvent(event);
|
propagateEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
// now update all protocols
|
// now update all protocols that need to be updated in asynchronous mode
|
||||||
pthread_mutex_lock(&m_protocols_mutex);
|
pthread_mutex_lock(&m_protocols_mutex);
|
||||||
for (unsigned int i = 0; i < m_protocols.size(); i++)
|
for (unsigned int i = 0; i < m_protocols.size(); i++)
|
||||||
{
|
{
|
||||||
if (m_protocols[i].state == PROTOCOL_STATE_RUNNING)
|
if (m_protocols[i].state == PROTOCOL_STATE_RUNNING)
|
||||||
m_protocols[i].protocol->update();
|
m_protocols[i].protocol->asynchronousUpdate();
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&m_protocols_mutex);
|
pthread_mutex_unlock(&m_protocols_mutex);
|
||||||
|
|
||||||
// process queued events for protocols
|
// process queued events for protocols
|
||||||
|
// these requests are asynchronous
|
||||||
pthread_mutex_lock(&m_requests_mutex);
|
pthread_mutex_lock(&m_requests_mutex);
|
||||||
for (unsigned int i = 0; i < m_requests.size(); i++)
|
for (unsigned int i = 0; i < m_requests.size(); i++)
|
||||||
{
|
{
|
||||||
|
@ -158,10 +158,21 @@ class ProtocolManager : public Singleton<ProtocolManager>
|
|||||||
* protocols that they have events to process. Then ask all protocols
|
* protocols that they have events to process. Then ask all protocols
|
||||||
* to update themselves. Finally processes stored requests about
|
* to update themselves. Finally processes stored requests about
|
||||||
* starting, stoping, pausing etc... protocols.
|
* starting, stoping, pausing etc... protocols.
|
||||||
* This function is called by a thread as often as possible.
|
* This function is called by the main loop.
|
||||||
* This function is not FPS-dependant.
|
* This function IS FPS-dependant.
|
||||||
*/
|
*/
|
||||||
virtual void update();
|
virtual void update();
|
||||||
|
/*!
|
||||||
|
* \brief Updates the manager.
|
||||||
|
*
|
||||||
|
* This function processes the events queue, notifies the concerned
|
||||||
|
* protocols that they have events to process. Then ask all protocols
|
||||||
|
* to update themselves. Finally processes stored requests about
|
||||||
|
* starting, stoping, pausing etc... protocols.
|
||||||
|
* This function is called in a thread.
|
||||||
|
* This function IS NOT FPS-dependant.
|
||||||
|
*/
|
||||||
|
virtual void asynchronousUpdate();
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Get the number of protocols running.
|
* \brief Get the number of protocols running.
|
||||||
@ -296,6 +307,8 @@ class ProtocolManager : public Singleton<ProtocolManager>
|
|||||||
|
|
||||||
/*! Update thread.*/
|
/*! Update thread.*/
|
||||||
pthread_t* m_update_thread;
|
pthread_t* m_update_thread;
|
||||||
|
/*! Asynchronous update thread.*/
|
||||||
|
pthread_t* m_asynchronous_update_thread;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ class ClientLobbyRoomProtocol : public LobbyRoomProtocol
|
|||||||
virtual void notifyEvent(Event* event);
|
virtual void notifyEvent(Event* event);
|
||||||
virtual void setup();
|
virtual void setup();
|
||||||
virtual void update();
|
virtual void update();
|
||||||
|
virtual void asynchronousUpdate() {}
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
ConnectToPeer::ConnectToPeer(uint32_t peer_id) :
|
ConnectToPeer::ConnectToPeer(uint32_t peer_id) :
|
||||||
Protocol(NULL, PROTOCOL_CONNECTION)
|
Protocol(NULL, PROTOCOL_CONNECTION)
|
||||||
{
|
{
|
||||||
m_peer_id = peer_id;
|
m_peer_id = peer_id;
|
||||||
@ -69,7 +69,7 @@ void ConnectToPeer::setup()
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
void ConnectToPeer::update()
|
void ConnectToPeer::asynchronousUpdate()
|
||||||
{
|
{
|
||||||
switch(m_state)
|
switch(m_state)
|
||||||
{
|
{
|
||||||
@ -80,11 +80,11 @@ void ConnectToPeer::update()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WAITING_PEER_ADDRESS:
|
case WAITING_PEER_ADDRESS:
|
||||||
if (m_listener->getProtocolState(m_current_protocol_id)
|
if (m_listener->getProtocolState(m_current_protocol_id)
|
||||||
== PROTOCOL_STATE_TERMINATED) // we know the peer address
|
== PROTOCOL_STATE_TERMINATED) // we know the peer address
|
||||||
{
|
{
|
||||||
if (m_peer_address.ip != 0 && m_peer_address.port != 0)
|
if (m_peer_address.ip != 0 && m_peer_address.port != 0)
|
||||||
{
|
{
|
||||||
m_state = CONNECTING;
|
m_state = CONNECTING;
|
||||||
m_current_protocol_id = m_listener->requestStart(new PingProtocol(m_peer_address, 2.0));
|
m_current_protocol_id = m_listener->requestStart(new PingProtocol(m_peer_address, 2.0));
|
||||||
}
|
}
|
||||||
|
@ -28,17 +28,18 @@ class ConnectToPeer : public Protocol, public CallbackObject
|
|||||||
public:
|
public:
|
||||||
ConnectToPeer(uint32_t peer_id);
|
ConnectToPeer(uint32_t peer_id);
|
||||||
virtual ~ConnectToPeer();
|
virtual ~ConnectToPeer();
|
||||||
|
|
||||||
virtual void notifyEvent(Event* event);
|
virtual void notifyEvent(Event* event);
|
||||||
virtual void setup();
|
virtual void setup();
|
||||||
virtual void update();
|
virtual void update() {}
|
||||||
|
virtual void asynchronousUpdate();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
TransportAddress m_peer_address;
|
TransportAddress m_peer_address;
|
||||||
TransportAddress m_public_address;
|
TransportAddress m_public_address;
|
||||||
uint32_t m_peer_id;
|
uint32_t m_peer_id;
|
||||||
uint32_t m_current_protocol_id;
|
uint32_t m_current_protocol_id;
|
||||||
|
|
||||||
enum STATE
|
enum STATE
|
||||||
{
|
{
|
||||||
NONE,
|
NONE,
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
ConnectToServer::ConnectToServer() :
|
ConnectToServer::ConnectToServer() :
|
||||||
Protocol(NULL, PROTOCOL_CONNECTION)
|
Protocol(NULL, PROTOCOL_CONNECTION)
|
||||||
{
|
{
|
||||||
m_server_id = 0;
|
m_server_id = 0;
|
||||||
@ -43,7 +43,7 @@ ConnectToServer::ConnectToServer() :
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
ConnectToServer::ConnectToServer(uint32_t server_id) :
|
ConnectToServer::ConnectToServer(uint32_t server_id) :
|
||||||
Protocol(NULL, PROTOCOL_CONNECTION)
|
Protocol(NULL, PROTOCOL_CONNECTION)
|
||||||
{
|
{
|
||||||
m_server_id = server_id;
|
m_server_id = server_id;
|
||||||
@ -83,7 +83,7 @@ void ConnectToServer::setup()
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
void ConnectToServer::update()
|
void ConnectToServer::asynchronousUpdate()
|
||||||
{
|
{
|
||||||
switch(m_state)
|
switch(m_state)
|
||||||
{
|
{
|
||||||
@ -94,7 +94,7 @@ void ConnectToServer::update()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GETTING_SELF_ADDRESS:
|
case GETTING_SELF_ADDRESS:
|
||||||
if (m_listener->getProtocolState(m_current_protocol_id)
|
if (m_listener->getProtocolState(m_current_protocol_id)
|
||||||
== PROTOCOL_STATE_TERMINATED) // now we know the public addr
|
== PROTOCOL_STATE_TERMINATED) // now we know the public addr
|
||||||
{
|
{
|
||||||
m_state = SHOWING_SELF_ADDRESS;
|
m_state = SHOWING_SELF_ADDRESS;
|
||||||
@ -108,7 +108,7 @@ void ConnectToServer::update()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SHOWING_SELF_ADDRESS:
|
case SHOWING_SELF_ADDRESS:
|
||||||
if (m_listener->getProtocolState(m_current_protocol_id)
|
if (m_listener->getProtocolState(m_current_protocol_id)
|
||||||
== PROTOCOL_STATE_TERMINATED) // now our public address is in the database
|
== PROTOCOL_STATE_TERMINATED) // now our public address is in the database
|
||||||
{
|
{
|
||||||
if (m_quick_join)
|
if (m_quick_join)
|
||||||
@ -124,7 +124,7 @@ void ConnectToServer::update()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GETTING_SERVER_ADDRESS:
|
case GETTING_SERVER_ADDRESS:
|
||||||
if (m_listener->getProtocolState(m_current_protocol_id)
|
if (m_listener->getProtocolState(m_current_protocol_id)
|
||||||
== PROTOCOL_STATE_TERMINATED) // we know the server address
|
== PROTOCOL_STATE_TERMINATED) // we know the server address
|
||||||
{
|
{
|
||||||
m_state = REQUESTING_CONNECTION;
|
m_state = REQUESTING_CONNECTION;
|
||||||
@ -132,10 +132,10 @@ void ConnectToServer::update()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case REQUESTING_CONNECTION:
|
case REQUESTING_CONNECTION:
|
||||||
if (m_listener->getProtocolState(m_current_protocol_id)
|
if (m_listener->getProtocolState(m_current_protocol_id)
|
||||||
== PROTOCOL_STATE_TERMINATED) // server knows we wanna connect
|
== PROTOCOL_STATE_TERMINATED) // server knows we wanna connect
|
||||||
{
|
{
|
||||||
if (m_server_address.ip == 0 || m_server_address.port == 0)
|
if (m_server_address.ip == 0 || m_server_address.port == 0)
|
||||||
{ // server data not correct, hide address and stop
|
{ // server data not correct, hide address and stop
|
||||||
m_state = HIDING_ADDRESS;
|
m_state = HIDING_ADDRESS;
|
||||||
m_current_protocol_id = m_listener->requestStart(new HidePublicAddress());
|
m_current_protocol_id = m_listener->requestStart(new HidePublicAddress());
|
||||||
@ -164,7 +164,7 @@ void ConnectToServer::update()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case HIDING_ADDRESS:
|
case HIDING_ADDRESS:
|
||||||
if (m_listener->getProtocolState(m_current_protocol_id)
|
if (m_listener->getProtocolState(m_current_protocol_id)
|
||||||
== PROTOCOL_STATE_TERMINATED) // we have hidden our address
|
== PROTOCOL_STATE_TERMINATED) // we have hidden our address
|
||||||
{
|
{
|
||||||
m_state = DONE;
|
m_state = DONE;
|
||||||
|
@ -29,18 +29,19 @@ class ConnectToServer : public Protocol, public CallbackObject
|
|||||||
ConnectToServer(); //!< Quick join
|
ConnectToServer(); //!< Quick join
|
||||||
ConnectToServer(uint32_t server_id); //!< Specify server id
|
ConnectToServer(uint32_t server_id); //!< Specify server id
|
||||||
virtual ~ConnectToServer();
|
virtual ~ConnectToServer();
|
||||||
|
|
||||||
virtual void notifyEvent(Event* event);
|
virtual void notifyEvent(Event* event);
|
||||||
virtual void setup();
|
virtual void setup();
|
||||||
virtual void update();
|
virtual void update() {}
|
||||||
|
virtual void asynchronousUpdate();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
TransportAddress m_server_address;
|
TransportAddress m_server_address;
|
||||||
TransportAddress m_public_address;
|
TransportAddress m_public_address;
|
||||||
uint32_t m_server_id;
|
uint32_t m_server_id;
|
||||||
uint32_t m_current_protocol_id;
|
uint32_t m_current_protocol_id;
|
||||||
bool m_quick_join;
|
bool m_quick_join;
|
||||||
|
|
||||||
enum STATE
|
enum STATE
|
||||||
{
|
{
|
||||||
NONE,
|
NONE,
|
||||||
|
@ -44,7 +44,7 @@ void GetPeerAddress::setup()
|
|||||||
m_state = NONE;
|
m_state = NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetPeerAddress::update()
|
void GetPeerAddress::asynchronousUpdate()
|
||||||
{
|
{
|
||||||
if (m_state == NONE)
|
if (m_state == NONE)
|
||||||
{
|
{
|
||||||
|
@ -26,22 +26,23 @@ class GetPeerAddress : public Protocol
|
|||||||
public:
|
public:
|
||||||
GetPeerAddress(uint32_t peer_id, CallbackObject* callback_object);
|
GetPeerAddress(uint32_t peer_id, CallbackObject* callback_object);
|
||||||
virtual ~GetPeerAddress();
|
virtual ~GetPeerAddress();
|
||||||
|
|
||||||
virtual void notifyEvent(Event* event);
|
virtual void notifyEvent(Event* event);
|
||||||
virtual void setup();
|
virtual void setup();
|
||||||
virtual void update();
|
virtual void update() {}
|
||||||
|
virtual void asynchronousUpdate();
|
||||||
|
|
||||||
void setPeerID(uint32_t m_peer_id);
|
void setPeerID(uint32_t m_peer_id);
|
||||||
protected:
|
protected:
|
||||||
uint32_t m_peer_id;
|
uint32_t m_peer_id;
|
||||||
|
|
||||||
enum STATE
|
enum STATE
|
||||||
{
|
{
|
||||||
NONE,
|
NONE,
|
||||||
DONE
|
DONE
|
||||||
};
|
};
|
||||||
STATE m_state;
|
STATE m_state;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GET_PEER_ADDRESS_HPP
|
#endif // GET_PEER_ADDRESS_HPP
|
||||||
|
@ -55,8 +55,8 @@ void GetPublicAddress::setup()
|
|||||||
{
|
{
|
||||||
m_state = NOTHING_DONE;
|
m_state = NOTHING_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetPublicAddress::update()
|
void GetPublicAddress::asynchronousUpdate()
|
||||||
{
|
{
|
||||||
if (m_state == NOTHING_DONE)
|
if (m_state == NOTHING_DONE)
|
||||||
{
|
{
|
||||||
@ -66,22 +66,22 @@ void GetPublicAddress::update()
|
|||||||
m_stun_tansaction_id[1] = stunRand();
|
m_stun_tansaction_id[1] = stunRand();
|
||||||
m_stun_tansaction_id[2] = stunRand();
|
m_stun_tansaction_id[2] = stunRand();
|
||||||
uint16_t message_length = 0x0000;
|
uint16_t message_length = 0x0000;
|
||||||
|
|
||||||
uint8_t bytes[21]; // the message to be sent
|
uint8_t bytes[21]; // the message to be sent
|
||||||
// bytes 0-1 : the type of the message,
|
// bytes 0-1 : the type of the message,
|
||||||
bytes[0] = (uint8_t)(message_type>>8);
|
bytes[0] = (uint8_t)(message_type>>8);
|
||||||
bytes[1] = (uint8_t)(message_type);
|
bytes[1] = (uint8_t)(message_type);
|
||||||
|
|
||||||
// bytes 2-3 : message length added to header (attributes)
|
// bytes 2-3 : message length added to header (attributes)
|
||||||
bytes[2] = (uint8_t)(message_length>>8);
|
bytes[2] = (uint8_t)(message_length>>8);
|
||||||
bytes[3] = (uint8_t)(message_length);
|
bytes[3] = (uint8_t)(message_length);
|
||||||
|
|
||||||
// bytes 4-7 : magic cookie to recognize the stun protocol
|
// bytes 4-7 : magic cookie to recognize the stun protocol
|
||||||
bytes[4] = (uint8_t)(m_stun_magic_cookie>>24);
|
bytes[4] = (uint8_t)(m_stun_magic_cookie>>24);
|
||||||
bytes[5] = (uint8_t)(m_stun_magic_cookie>>16);
|
bytes[5] = (uint8_t)(m_stun_magic_cookie>>16);
|
||||||
bytes[6] = (uint8_t)(m_stun_magic_cookie>>8);
|
bytes[6] = (uint8_t)(m_stun_magic_cookie>>8);
|
||||||
bytes[7] = (uint8_t)(m_stun_magic_cookie);
|
bytes[7] = (uint8_t)(m_stun_magic_cookie);
|
||||||
|
|
||||||
// bytes 8-19 : the transaction id
|
// bytes 8-19 : the transaction id
|
||||||
bytes[8] = (uint8_t)(m_stun_tansaction_id[0]>>24);
|
bytes[8] = (uint8_t)(m_stun_tansaction_id[0]>>24);
|
||||||
bytes[9] = (uint8_t)(m_stun_tansaction_id[0]>>16);
|
bytes[9] = (uint8_t)(m_stun_tansaction_id[0]>>16);
|
||||||
@ -95,8 +95,8 @@ void GetPublicAddress::update()
|
|||||||
bytes[17] = (uint8_t)(m_stun_tansaction_id[2]>>16);
|
bytes[17] = (uint8_t)(m_stun_tansaction_id[2]>>16);
|
||||||
bytes[18] = (uint8_t)(m_stun_tansaction_id[2]>>8);
|
bytes[18] = (uint8_t)(m_stun_tansaction_id[2]>>8);
|
||||||
bytes[19] = (uint8_t)(m_stun_tansaction_id[2]);
|
bytes[19] = (uint8_t)(m_stun_tansaction_id[2]);
|
||||||
bytes[20] = '\0';
|
bytes[20] = '\0';
|
||||||
|
|
||||||
Log::verbose("GetPublicAddress", "Querrying STUN server 132.177.123.6");
|
Log::verbose("GetPublicAddress", "Querrying STUN server 132.177.123.6");
|
||||||
unsigned int dst = (132<<24)+(177<<16)+(123<<8)+6;
|
unsigned int dst = (132<<24)+(177<<16)+(123<<8)+6;
|
||||||
NetworkManager::getInstance()->setManualSocketsMode(true);
|
NetworkManager::getInstance()->setManualSocketsMode(true);
|
||||||
@ -108,7 +108,7 @@ void GetPublicAddress::update()
|
|||||||
unsigned int dst = (132<<24)+(177<<16)+(123<<8)+6;
|
unsigned int dst = (132<<24)+(177<<16)+(123<<8)+6;
|
||||||
uint8_t* data = NetworkManager::getInstance()->getHost()->receiveRawPacket(TransportAddress(dst, 3478));
|
uint8_t* data = NetworkManager::getInstance()->getHost()->receiveRawPacket(TransportAddress(dst, 3478));
|
||||||
assert(data);
|
assert(data);
|
||||||
|
|
||||||
// check that the stun response is a response, contains the magic cookie and the transaction ID
|
// check that the stun response is a response, contains the magic cookie and the transaction ID
|
||||||
if ( data[0] == 0x01 &&
|
if ( data[0] == 0x01 &&
|
||||||
data[1] == 0x01 &&
|
data[1] == 0x01 &&
|
||||||
@ -133,7 +133,7 @@ void GetPublicAddress::update()
|
|||||||
{
|
{
|
||||||
Log::verbose("GetPublicAddress", "The STUN server responded with a valid answer");
|
Log::verbose("GetPublicAddress", "The STUN server responded with a valid answer");
|
||||||
int message_size = data[2]*256+data[3];
|
int message_size = data[2]*256+data[3];
|
||||||
|
|
||||||
// parse the stun message now:
|
// parse the stun message now:
|
||||||
bool finish = false;
|
bool finish = false;
|
||||||
uint8_t* attributes = data+20;
|
uint8_t* attributes = data+20;
|
||||||
@ -149,7 +149,7 @@ void GetPublicAddress::update()
|
|||||||
}
|
}
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
uint32_t address;
|
uint32_t address;
|
||||||
bool valid = false;
|
bool valid = false;
|
||||||
while(!finish)
|
while(!finish)
|
||||||
{
|
{
|
||||||
int type = attributes[0]*256+attributes[1];
|
int type = attributes[0]*256+attributes[1];
|
||||||
@ -160,13 +160,13 @@ void GetPublicAddress::update()
|
|||||||
case 1:
|
case 1:
|
||||||
assert(size == 8);
|
assert(size == 8);
|
||||||
assert(attributes[5] = 0x01); // IPv4 only
|
assert(attributes[5] = 0x01); // IPv4 only
|
||||||
port = attributes[6]*256+attributes[7];
|
port = attributes[6]*256+attributes[7];
|
||||||
address = (attributes[8]<<24 & 0xFF000000)+(attributes[9]<<16 & 0x00FF0000)+(attributes[10]<<8 & 0x0000FF00)+(attributes[11] & 0x000000FF);
|
address = (attributes[8]<<24 & 0xFF000000)+(attributes[9]<<16 & 0x00FF0000)+(attributes[10]<<8 & 0x0000FF00)+(attributes[11] & 0x000000FF);
|
||||||
finish = true;
|
finish = true;
|
||||||
valid = true;
|
valid = true;
|
||||||
continue;
|
continue;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
attributes = attributes + 4 + size;
|
attributes = attributes + 4 + size;
|
||||||
@ -184,15 +184,15 @@ void GetPublicAddress::update()
|
|||||||
{
|
{
|
||||||
Log::debug("GetPublicAddress", "The public address has been found : %i.%i.%i.%i:%i", address>>24&0xff, address>>16&0xff, address>>8&0xff, address&0xff, port);
|
Log::debug("GetPublicAddress", "The public address has been found : %i.%i.%i.%i:%i", address>>24&0xff, address>>16&0xff, address>>8&0xff, address&0xff, port);
|
||||||
m_state = ADDRESS_KNOWN;
|
m_state = ADDRESS_KNOWN;
|
||||||
NetworkManager::getInstance()->setManualSocketsMode(false);
|
NetworkManager::getInstance()->setManualSocketsMode(false);
|
||||||
TransportAddress* addr = static_cast<TransportAddress*>(m_callback_object);
|
TransportAddress* addr = static_cast<TransportAddress*>(m_callback_object);
|
||||||
addr->ip = address;
|
addr->ip = address;
|
||||||
addr->port = port;
|
addr->port = port;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
m_state = NOTHING_DONE; // need to re-send the stun request
|
m_state = NOTHING_DONE; // need to re-send the stun request
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_state = NOTHING_DONE; // need to re-send the stun request
|
m_state = NOTHING_DONE; // need to re-send the stun request
|
||||||
}
|
}
|
||||||
|
@ -26,12 +26,13 @@ class GetPublicAddress : public Protocol
|
|||||||
public:
|
public:
|
||||||
GetPublicAddress(CallbackObject* callback_object);
|
GetPublicAddress(CallbackObject* callback_object);
|
||||||
virtual ~GetPublicAddress();
|
virtual ~GetPublicAddress();
|
||||||
|
|
||||||
virtual void notifyEvent(Event* event);
|
virtual void notifyEvent(Event* event);
|
||||||
|
|
||||||
virtual void setup();
|
virtual void setup();
|
||||||
virtual void update();
|
virtual void update() {}
|
||||||
|
virtual void asynchronousUpdate();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
enum STATE
|
enum STATE
|
||||||
{
|
{
|
||||||
|
@ -41,7 +41,7 @@ void HidePublicAddress::setup()
|
|||||||
m_state = NONE;
|
m_state = NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HidePublicAddress::update()
|
void HidePublicAddress::asynchronousUpdate()
|
||||||
{
|
{
|
||||||
if (m_state == NONE)
|
if (m_state == NONE)
|
||||||
{
|
{
|
||||||
|
@ -27,13 +27,14 @@ class HidePublicAddress : public Protocol
|
|||||||
public:
|
public:
|
||||||
HidePublicAddress();
|
HidePublicAddress();
|
||||||
virtual ~HidePublicAddress();
|
virtual ~HidePublicAddress();
|
||||||
|
|
||||||
virtual void notifyEvent(Event* event);
|
virtual void notifyEvent(Event* event);
|
||||||
virtual void setup();
|
virtual void setup();
|
||||||
virtual void update();
|
virtual void update() {}
|
||||||
|
virtual void asynchronousUpdate();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
enum STATE
|
enum STATE
|
||||||
{
|
{
|
||||||
NONE,
|
NONE,
|
||||||
|
@ -40,7 +40,7 @@ void PingProtocol::setup()
|
|||||||
m_last_ping_time = 0;
|
m_last_ping_time = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PingProtocol::update()
|
void PingProtocol::asynchronousUpdate()
|
||||||
{
|
{
|
||||||
if (Time::getRealTime() > m_last_ping_time+m_delay_between_pings)
|
if (Time::getRealTime() > m_last_ping_time+m_delay_between_pings)
|
||||||
{
|
{
|
||||||
|
@ -9,11 +9,12 @@ class PingProtocol : public Protocol
|
|||||||
public:
|
public:
|
||||||
PingProtocol(const TransportAddress& ping_dst, double delay_between_pings);
|
PingProtocol(const TransportAddress& ping_dst, double delay_between_pings);
|
||||||
virtual ~PingProtocol();
|
virtual ~PingProtocol();
|
||||||
|
|
||||||
virtual void notifyEvent(Event* event);
|
virtual void notifyEvent(Event* event);
|
||||||
virtual void setup();
|
virtual void setup();
|
||||||
virtual void update();
|
virtual void update() {}
|
||||||
|
virtual void asynchronousUpdate();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
TransportAddress m_ping_dst;
|
TransportAddress m_ping_dst;
|
||||||
double m_delay_between_pings;
|
double m_delay_between_pings;
|
||||||
|
@ -42,7 +42,7 @@ void QuickJoinProtocol::setup()
|
|||||||
m_state = NONE;
|
m_state = NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuickJoinProtocol::update()
|
void QuickJoinProtocol::asynchronousUpdate()
|
||||||
{
|
{
|
||||||
if (m_state == NONE)
|
if (m_state == NONE)
|
||||||
{
|
{
|
||||||
|
@ -9,11 +9,12 @@ class QuickJoinProtocol : public Protocol
|
|||||||
public:
|
public:
|
||||||
QuickJoinProtocol(CallbackObject* callback_object, uint32_t* server_id);
|
QuickJoinProtocol(CallbackObject* callback_object, uint32_t* server_id);
|
||||||
virtual ~QuickJoinProtocol();
|
virtual ~QuickJoinProtocol();
|
||||||
|
|
||||||
virtual void notifyEvent(Event* event);
|
virtual void notifyEvent(Event* event);
|
||||||
virtual void setup();
|
virtual void setup();
|
||||||
virtual void update();
|
virtual void update() {}
|
||||||
|
virtual void asynchronousUpdate();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
uint32_t* m_server_id;
|
uint32_t* m_server_id;
|
||||||
enum STATE
|
enum STATE
|
||||||
|
@ -41,7 +41,7 @@ void RequestConnection::setup()
|
|||||||
m_state = NONE;
|
m_state = NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RequestConnection::update()
|
void RequestConnection::asynchronousUpdate()
|
||||||
{
|
{
|
||||||
switch (m_state)
|
switch (m_state)
|
||||||
{
|
{
|
||||||
|
@ -8,21 +8,22 @@ class RequestConnection : public Protocol
|
|||||||
public:
|
public:
|
||||||
RequestConnection(uint32_t server_id);
|
RequestConnection(uint32_t server_id);
|
||||||
virtual ~RequestConnection();
|
virtual ~RequestConnection();
|
||||||
|
|
||||||
virtual void notifyEvent(Event* event);
|
virtual void notifyEvent(Event* event);
|
||||||
virtual void setup();
|
virtual void setup();
|
||||||
virtual void update();
|
virtual void update() {}
|
||||||
|
virtual void asynchronousUpdate();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
uint32_t m_server_id;
|
uint32_t m_server_id;
|
||||||
|
|
||||||
enum STATE
|
enum STATE
|
||||||
{
|
{
|
||||||
NONE,
|
NONE,
|
||||||
DONE
|
DONE
|
||||||
};
|
};
|
||||||
STATE m_state;
|
STATE m_state;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // REQUEST_CONNECTION_HPP
|
#endif // REQUEST_CONNECTION_HPP
|
||||||
|
@ -12,6 +12,7 @@ class ServerLobbyRoomProtocol : public LobbyRoomProtocol
|
|||||||
virtual void notifyEvent(Event* event);
|
virtual void notifyEvent(Event* event);
|
||||||
virtual void setup();
|
virtual void setup();
|
||||||
virtual void update();
|
virtual void update();
|
||||||
|
virtual void asynchronousUpdate() {};
|
||||||
|
|
||||||
void startGame();
|
void startGame();
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ void ShowPublicAddress::setup()
|
|||||||
m_state = NONE;
|
m_state = NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowPublicAddress::update()
|
void ShowPublicAddress::asynchronousUpdate()
|
||||||
{
|
{
|
||||||
if (m_state == NONE)
|
if (m_state == NONE)
|
||||||
{
|
{
|
||||||
|
@ -27,13 +27,14 @@ class ShowPublicAddress : public Protocol
|
|||||||
public:
|
public:
|
||||||
ShowPublicAddress();
|
ShowPublicAddress();
|
||||||
virtual ~ShowPublicAddress();
|
virtual ~ShowPublicAddress();
|
||||||
|
|
||||||
virtual void notifyEvent(Event* event);
|
virtual void notifyEvent(Event* event);
|
||||||
virtual void setup();
|
virtual void setup();
|
||||||
virtual void update();
|
virtual void update() {}
|
||||||
|
virtual void asynchronousUpdate();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
enum STATE
|
enum STATE
|
||||||
{
|
{
|
||||||
NONE,
|
NONE,
|
||||||
|
@ -26,6 +26,7 @@ class StartGameProtocol : public Protocol
|
|||||||
virtual void notifyEvent(Event* event);
|
virtual void notifyEvent(Event* event);
|
||||||
virtual void setup();
|
virtual void setup();
|
||||||
virtual void update();
|
virtual void update();
|
||||||
|
virtual void asynchronousUpdate() {}
|
||||||
|
|
||||||
void ready();
|
void ready();
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ void StartServer::setup()
|
|||||||
m_state = NONE;
|
m_state = NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StartServer::update()
|
void StartServer::asynchronousUpdate()
|
||||||
{
|
{
|
||||||
if (m_state == NONE)
|
if (m_state == NONE)
|
||||||
{
|
{
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include "network/protocol.hpp"
|
#include "network/protocol.hpp"
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* This protocol tells to the database that the server is up and running,
|
* This protocol tells to the database that the server is up and running,
|
||||||
* and shows online the public IP:port that stores the NetworkManager.
|
* and shows online the public IP:port that stores the NetworkManager.
|
||||||
*/
|
*/
|
||||||
class StartServer : public Protocol
|
class StartServer : public Protocol
|
||||||
@ -12,11 +12,12 @@ class StartServer : public Protocol
|
|||||||
public:
|
public:
|
||||||
StartServer();
|
StartServer();
|
||||||
virtual ~StartServer();
|
virtual ~StartServer();
|
||||||
|
|
||||||
virtual void notifyEvent(Event* event);
|
virtual void notifyEvent(Event* event);
|
||||||
virtual void setup();
|
virtual void setup();
|
||||||
virtual void update();
|
virtual void update() {}
|
||||||
|
virtual void asynchronousUpdate();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
enum STATE
|
enum STATE
|
||||||
{
|
{
|
||||||
|
@ -40,7 +40,7 @@ void StopServer::setup()
|
|||||||
m_state = NONE;
|
m_state = NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StopServer::update()
|
void StopServer::asynchronousUpdate()
|
||||||
{
|
{
|
||||||
if (m_state == NONE)
|
if (m_state == NONE)
|
||||||
{
|
{
|
||||||
|
@ -12,11 +12,12 @@ class StopServer : public Protocol
|
|||||||
public:
|
public:
|
||||||
StopServer();
|
StopServer();
|
||||||
virtual ~StopServer();
|
virtual ~StopServer();
|
||||||
|
|
||||||
virtual void notifyEvent(Event* event);
|
virtual void notifyEvent(Event* event);
|
||||||
virtual void setup();
|
virtual void setup();
|
||||||
virtual void update();
|
virtual void update() {}
|
||||||
|
virtual void asynchronousUpdate();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
enum STATE
|
enum STATE
|
||||||
{
|
{
|
||||||
|
@ -103,7 +103,7 @@ void SynchronizationProtocol::setup()
|
|||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
void SynchronizationProtocol::update()
|
void SynchronizationProtocol::asynchronousUpdate()
|
||||||
{
|
{
|
||||||
static double timer = Time::getRealTime();
|
static double timer = Time::getRealTime();
|
||||||
double current_time = Time::getRealTime();
|
double current_time = Time::getRealTime();
|
||||||
@ -123,7 +123,7 @@ void SynchronizationProtocol::update()
|
|||||||
if (m_countdown_activated)
|
if (m_countdown_activated)
|
||||||
{
|
{
|
||||||
ns.ai16(m_countdown);
|
ns.ai16(m_countdown);
|
||||||
Log::info("SynchronizationProtocol", "Countdown value : %u", m_countdown);
|
Log::info("SynchronizationProtocol", "Countdown value : %d", m_countdown);
|
||||||
}
|
}
|
||||||
Log::verbose("SynchronizationProtocol", "Added sequence number %u for peer %d", m_pings[i].size(), i);
|
Log::verbose("SynchronizationProtocol", "Added sequence number %u for peer %d", m_pings[i].size(), i);
|
||||||
timer = current_time;
|
timer = current_time;
|
||||||
@ -131,7 +131,7 @@ void SynchronizationProtocol::update()
|
|||||||
m_listener->sendMessage(this, peers[i], ns, false);
|
m_listener->sendMessage(this, peers[i], ns, false);
|
||||||
m_pings_count[i]++;
|
m_pings_count[i]++;
|
||||||
}
|
}
|
||||||
Log::info("SynchronizationProtocol", "Countdown remaining : %u", m_countdown);
|
Log::info("SynchronizationProtocol", "Countdown remaining : %d", m_countdown);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,7 +13,8 @@ class SynchronizationProtocol : public Protocol
|
|||||||
|
|
||||||
virtual void notifyEvent(Event* event);
|
virtual void notifyEvent(Event* event);
|
||||||
virtual void setup();
|
virtual void setup();
|
||||||
virtual void update();
|
virtual void update() {}
|
||||||
|
virtual void asynchronousUpdate();
|
||||||
|
|
||||||
void startCountdown(int ms_countdown);
|
void startCountdown(int ms_countdown);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user