mirror of https://github.com/OpenTTD/OpenTTD
Codechange: allow Connect() to bind to a local address
parent
695e1493c9
commit
55eed246b8
|
@ -98,6 +98,7 @@ private:
|
||||||
std::chrono::steady_clock::time_point last_attempt; ///< Time we last tried to connect.
|
std::chrono::steady_clock::time_point last_attempt; ///< Time we last tried to connect.
|
||||||
|
|
||||||
std::string connection_string; ///< Current address we are connecting to (before resolving).
|
std::string connection_string; ///< Current address we are connecting to (before resolving).
|
||||||
|
NetworkAddress bind_address; ///< Address we're binding to, if any.
|
||||||
|
|
||||||
void Resolve();
|
void Resolve();
|
||||||
void OnResolved(addrinfo *ai);
|
void OnResolved(addrinfo *ai);
|
||||||
|
@ -113,7 +114,7 @@ private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TCPConnecter() {};
|
TCPConnecter() {};
|
||||||
TCPConnecter(const std::string &connection_string, uint16 default_port);
|
TCPConnecter(const std::string &connection_string, uint16 default_port, NetworkAddress bind_address = {});
|
||||||
virtual ~TCPConnecter();
|
virtual ~TCPConnecter();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -24,10 +24,13 @@
|
||||||
static std::vector<TCPConnecter *> _tcp_connecters;
|
static std::vector<TCPConnecter *> _tcp_connecters;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new connecter for the given address
|
* Create a new connecter for the given address.
|
||||||
* @param connection_string the address to connect to
|
* @param connection_string The address to connect to.
|
||||||
|
* @param default_port If not indicated in connection_string, what port to use.
|
||||||
|
* @param bind_address The local bind address to use. Defaults to letting the OS find one.
|
||||||
*/
|
*/
|
||||||
TCPConnecter::TCPConnecter(const std::string &connection_string, uint16 default_port)
|
TCPConnecter::TCPConnecter(const std::string &connection_string, uint16 default_port, NetworkAddress bind_address) :
|
||||||
|
bind_address(bind_address)
|
||||||
{
|
{
|
||||||
this->connection_string = NormalizeConnectionString(connection_string, default_port);
|
this->connection_string = NormalizeConnectionString(connection_string, default_port);
|
||||||
|
|
||||||
|
@ -96,6 +99,14 @@ void TCPConnecter::Connect(addrinfo *address)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this->bind_address.GetPort() > 0) {
|
||||||
|
if (bind(sock, (const sockaddr *)this->bind_address.GetAddress(), this->bind_address.GetAddressLength()) != 0) {
|
||||||
|
Debug(net, 1, "Could not bind socket on {}: {}", this->bind_address.GetAddressAsString(), NetworkError::GetLast().AsString());
|
||||||
|
closesocket(sock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!SetNoDelay(sock)) {
|
if (!SetNoDelay(sock)) {
|
||||||
Debug(net, 1, "Setting TCP_NODELAY failed: {}", NetworkError::GetLast().AsString());
|
Debug(net, 1, "Setting TCP_NODELAY failed: {}", NetworkError::GetLast().AsString());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue