forked from mirror/OpenTTD
(svn r15163) -Change/Fix: use a non-blocking method to resolve the hostname and connect to game servers.
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
#ifdef ENABLE_NETWORK
|
||||
|
||||
#include "os_abstraction.h"
|
||||
#include "address.h"
|
||||
#include "core.h"
|
||||
#include "packet.h"
|
||||
|
||||
@@ -31,6 +32,62 @@ public:
|
||||
~NetworkTCPSocketHandler();
|
||||
};
|
||||
|
||||
/**
|
||||
* "Helper" class for creating TCP connections in a non-blocking manner
|
||||
*/
|
||||
class TCPConnecter {
|
||||
private:
|
||||
class ThreadObject *thread; ///< Thread used to create the TCP connection
|
||||
bool connected; ///< Whether we succeeded in making the connection
|
||||
bool aborted; ///< Whether we bailed out (i.e. connection making failed)
|
||||
bool killed; ///< Whether we got killed
|
||||
SOCKET sock; ///< The socket we're connecting with
|
||||
|
||||
/** The actual connection function */
|
||||
void Connect();
|
||||
|
||||
/**
|
||||
* Entry point for the new threads.
|
||||
* @param param the TCPConnecter instance to call Connect on.
|
||||
*/
|
||||
static void ThreadEntry(void *param);
|
||||
|
||||
protected:
|
||||
/** Address we're connecting to */
|
||||
NetworkAddress address;
|
||||
|
||||
public:
|
||||
/**
|
||||
* Create a new connecter for the given address
|
||||
* @param address the (un)resolved address to connect to
|
||||
*/
|
||||
TCPConnecter(const NetworkAddress &address);
|
||||
/** Silence the warnings */
|
||||
virtual ~TCPConnecter() {}
|
||||
|
||||
/**
|
||||
* Callback when the connection succeeded.
|
||||
* @param s the socket that we opened
|
||||
*/
|
||||
virtual void OnConnect(SOCKET s) {}
|
||||
|
||||
/**
|
||||
* Callback for when the connection attempt failed.
|
||||
*/
|
||||
virtual void OnFailure() {}
|
||||
|
||||
/**
|
||||
* Check whether we need to call the callback, i.e. whether we
|
||||
* have connected or aborted and call the appropriate callback
|
||||
* for that. It's done this way to ease on the locking that
|
||||
* would otherwise be needed everywhere.
|
||||
*/
|
||||
static void CheckCallbacks();
|
||||
|
||||
/** Kill all connection attempts. */
|
||||
static void KillAll();
|
||||
};
|
||||
|
||||
#endif /* ENABLE_NETWORK */
|
||||
|
||||
#endif /* NETWORK_CORE_TCP_H */
|
||||
|
Reference in New Issue
Block a user