Make sure the correct socket type is used
This commit is contained in:
parent
9860191409
commit
a1fa1749d1
@ -63,6 +63,7 @@ Network::Network(int peer_count, int channel_limit,
|
|||||||
uint32_t max_outgoing_bandwidth,
|
uint32_t max_outgoing_bandwidth,
|
||||||
ENetAddress* address, bool change_port_if_bound)
|
ENetAddress* address, bool change_port_if_bound)
|
||||||
{
|
{
|
||||||
|
m_ipv6_socket = false;
|
||||||
m_port = 0;
|
m_port = 0;
|
||||||
m_host = enet_host_create(address, peer_count, channel_limit, 0, 0);
|
m_host = enet_host_create(address, peer_count, channel_limit, 0, 0);
|
||||||
if (!m_host && change_port_if_bound)
|
if (!m_host && change_port_if_bound)
|
||||||
@ -77,29 +78,30 @@ Network::Network(int peer_count, int channel_limit,
|
|||||||
if (!m_host)
|
if (!m_host)
|
||||||
Log::fatal("Network", "Failed to create socket with any port.");
|
Log::fatal("Network", "Failed to create socket with any port.");
|
||||||
}
|
}
|
||||||
if (m_host && isIPv6Socket())
|
if (m_host)
|
||||||
{
|
{
|
||||||
struct sockaddr_in6 sin6;
|
struct sockaddr_storage ss;
|
||||||
socklen_t len = sizeof(sin6);
|
memset(&ss, 0, sizeof (struct sockaddr_storage));
|
||||||
if (getsockname(m_host->socket, (struct sockaddr*)&sin6, &len) == -1)
|
socklen_t len = sizeof(ss);
|
||||||
|
if (getsockname(m_host->socket, (struct sockaddr*)&ss, &len) == -1)
|
||||||
{
|
{
|
||||||
Log::error("STKHost", "Error while using getsockname().");
|
Log::error("STKHost", "Error while using getsockname().");
|
||||||
m_port = 0;
|
m_port = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
m_port = ntohs(sin6.sin6_port);
|
|
||||||
}
|
|
||||||
else if (m_host)
|
|
||||||
{
|
|
||||||
struct sockaddr_in sin;
|
|
||||||
socklen_t len = sizeof(sin);
|
|
||||||
if (getsockname(m_host->socket, (struct sockaddr*)&sin, &len) == -1)
|
|
||||||
{
|
{
|
||||||
Log::error("STKHost", "Error while using getsockname().");
|
m_ipv6_socket = ss.ss_family == AF_INET6;
|
||||||
m_port = 0;
|
if (m_ipv6_socket)
|
||||||
|
{
|
||||||
|
sockaddr_in6* sin6 = (sockaddr_in6*)&ss;
|
||||||
|
m_port = ntohs(sin6->sin6_port);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sockaddr_in* sin = (sockaddr_in*)&ss;
|
||||||
|
m_port = ntohs(sin->sin_port);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
m_port = ntohs(sin.sin_port);
|
|
||||||
}
|
}
|
||||||
} // Network
|
} // Network
|
||||||
|
|
||||||
|
@ -50,6 +50,7 @@ private:
|
|||||||
|
|
||||||
uint16_t m_port;
|
uint16_t m_port;
|
||||||
|
|
||||||
|
bool m_ipv6_socket;
|
||||||
/** Where to log packets. If NULL for FILE* logging is disabled. */
|
/** Where to log packets. If NULL for FILE* logging is disabled. */
|
||||||
static Synchronised<FILE*> m_log_file;
|
static Synchronised<FILE*> m_log_file;
|
||||||
|
|
||||||
@ -77,6 +78,8 @@ public:
|
|||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
/** Returns a pointer to the ENet host object. */
|
/** Returns a pointer to the ENet host object. */
|
||||||
ENetHost* getENetHost() { return m_host; }
|
ENetHost* getENetHost() { return m_host; }
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
bool isIPv6Socket() { return m_ipv6_socket; }
|
||||||
}; // class Network
|
}; // class Network
|
||||||
|
|
||||||
#endif // HEADER_ENET_SOCKET_HPP
|
#endif // HEADER_ENET_SOCKET_HPP
|
||||||
|
@ -231,12 +231,13 @@ void ConnectToServer::asynchronousUpdate()
|
|||||||
|
|
||||||
// Auto enable IPv6 socket in client with NAT64, then we convert
|
// Auto enable IPv6 socket in client with NAT64, then we convert
|
||||||
// the IPv4 address to NAT64 one in GOT_SERVER_ADDRESS
|
// the IPv4 address to NAT64 one in GOT_SERVER_ADDRESS
|
||||||
if (m_server->useIPV6Connection() ||
|
bool ipv6_socket = m_server->useIPV6Connection() ||
|
||||||
NetworkConfig::get()->getIPType() == NetworkConfig::IP_V6_NAT64)
|
NetworkConfig::get()->getIPType() == NetworkConfig::IP_V6_NAT64;
|
||||||
|
if (STKHost::get()->getNetwork()->isIPv6Socket() != ipv6_socket)
|
||||||
{
|
{
|
||||||
// Free the bound socket first
|
// Free the bound socket first
|
||||||
delete STKHost::get()->getNetwork();
|
delete STKHost::get()->getNetwork();
|
||||||
setIPv6Socket(1);
|
setIPv6Socket(ipv6_socket ? 1 : 0);
|
||||||
ENetAddress addr = {};
|
ENetAddress addr = {};
|
||||||
addr.port = NetworkConfig::get()->getClientPort();
|
addr.port = NetworkConfig::get()->getClientPort();
|
||||||
auto new_network = new Network(/*peer_count*/1,
|
auto new_network = new Network(/*peer_count*/1,
|
||||||
|
Loading…
Reference in New Issue
Block a user