diff --git a/include/linuxfixes.h b/include/linuxfixes.h index 9a3d0ae7..d798c9d6 100644 --- a/include/linuxfixes.h +++ b/include/linuxfixes.h @@ -13,6 +13,7 @@ #define SOCKET uint64_t #define SOCKADDR sockaddr #define SOCKADDR_IN sockaddr_in +#define SOCKADDR_IN6 sockaddr_in6 #define WSAGetLastError() errno #define closesocket close #define SD_BOTH SHUT_RDWR @@ -22,4 +23,4 @@ #define ZeroMemory(mem, len) memset(mem, 0, len) -#endif \ No newline at end of file +#endif diff --git a/src/Network/Core.cpp b/src/Network/Core.cpp index 8dddfdd8..2d63fc2e 100644 --- a/src/Network/Core.cpp +++ b/src/Network/Core.cpp @@ -70,8 +70,8 @@ bool SecurityWarning() { } void StartSync(const std::string& Data) { - std::string IP = GetAddr(Data.substr(1, Data.find(':') - 1)); - if (IP.find('.') == -1) { + std::string IP = GetAddr(Data.substr(1, Data.find_last_of(':') - 1)); + if (IP.find(':') == -1) { if (IP == "DNS") UlStatus = "UlConnection Failed! (DNS Lookup Failed)"; else @@ -86,7 +86,7 @@ void StartSync(const std::string& Data) { Terminate = false; ConfList->clear(); ping = -1; - std::thread GS(TCPGameServer, IP, std::stoi(Data.substr(Data.find(':') + 1))); + std::thread GS(TCPGameServer, IP, std::stoi(Data.substr(Data.find_last_of(':') + 1))); GS.detach(); info("Connecting to server"); } @@ -94,8 +94,8 @@ void StartSync(const std::string& Data) { void GetServerInfo(std::string Data) { debug("Fetching server info of " + Data.substr(1)); - std::string IP = GetAddr(Data.substr(1, Data.find(':') - 1)); - if (IP.find('.') == -1) { + std::string IP = GetAddr(Data.substr(1, Data.find_last_of(':') - 1)); + if (IP.find(':') == -1) { if (IP == "DNS") warn("Connection Failed! (DNS Lookup Failed) for " + Data); else @@ -104,15 +104,15 @@ void GetServerInfo(std::string Data) { return; } - SOCKET ISock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - SOCKADDR_IN ServerAddr; + SOCKET ISock = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); + SOCKADDR_IN6 ServerAddr; if (ISock < 1) { debug("Socket creation failed with error: " + std::to_string(WSAGetLastError())); KillSocket(ISock); CoreSend("I" + Data + ";"); return; } - ServerAddr.sin_family = AF_INET; + ServerAddr.sin6_family = AF_INET6; int port = std::stoi(Data.substr(Data.find(':') + 1)); @@ -123,8 +123,8 @@ void GetServerInfo(std::string Data) { return; } - ServerAddr.sin_port = htons(port); - inet_pton(AF_INET, IP.c_str(), &ServerAddr.sin_addr); + ServerAddr.sin6_port = htons(port); + inet_pton(AF_INET6, IP.c_str(), &ServerAddr.sin6_addr); if (connect(ISock, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr)) != 0) { debug("Connection to server failed with error: " + std::to_string(WSAGetLastError())); KillSocket(ISock); diff --git a/src/Network/DNS.cpp b/src/Network/DNS.cpp index f79b34b8..fb6c7d85 100644 --- a/src/Network/DNS.cpp +++ b/src/Network/DNS.cpp @@ -9,6 +9,7 @@ #if defined(_WIN32) #include +#include #elif defined(__linux__) #include "linuxfixes.h" #include @@ -18,9 +19,8 @@ #include "Logger.h" std::string GetAddr(const std::string& IP) { - if (IP.find_first_not_of("0123456789.") == -1) - return IP; - hostent* host; + struct addrinfo* res = nullptr; + struct addrinfo hints {0}; #ifdef _WIN32 WSADATA wsaData; if (WSAStartup(514, &wsaData) != 0) { @@ -30,13 +30,17 @@ std::string GetAddr(const std::string& IP) { } #endif - host = gethostbyname(IP.c_str()); - if (!host) { + hints.ai_family = AF_INET6; + hints.ai_flags = AI_V4MAPPED | AI_ADDRCONFIG; + if (getaddrinfo(IP.c_str(), NULL, &hints, &res) != 0) { error("DNS lookup failed! on " + IP); WSACleanup(); return "DNS"; } - std::string Ret = inet_ntoa(*((struct in_addr*)host->h_addr)); + char ipstr[INET6_ADDRSTRLEN]; + inet_ntop(AF_INET6, &((struct sockaddr_in6 *)res->ai_addr)->sin6_addr, ipstr, sizeof(ipstr)); + std::string Ret = ipstr; + freeaddrinfo(res); WSACleanup(); return Ret; -} \ No newline at end of file +} diff --git a/src/Network/GlobalHandler.cpp b/src/Network/GlobalHandler.cpp index c2290df6..743a7c40 100644 --- a/src/Network/GlobalHandler.cpp +++ b/src/Network/GlobalHandler.cpp @@ -133,7 +133,7 @@ SOCKET SetupListener() { #endif ZeroMemory(&hints, sizeof(hints)); - hints.ai_family = AF_INET; + hints.ai_family = AF_INET6; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_flags = AI_PASSIVE; diff --git a/src/Network/Resources.cpp b/src/Network/Resources.cpp index 26bc62e3..e6393908 100644 --- a/src/Network/Resources.cpp +++ b/src/Network/Resources.cpp @@ -197,16 +197,16 @@ void MultiKill(SOCKET Sock, SOCKET Sock1) { Terminate = true; } SOCKET InitDSock() { - SOCKET DSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - SOCKADDR_IN ServerAddr; + SOCKET DSock = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); + SOCKADDR_IN6 ServerAddr; if (DSock < 1) { KillSocket(DSock); Terminate = true; return 0; } - ServerAddr.sin_family = AF_INET; - ServerAddr.sin_port = htons(LastPort); - inet_pton(AF_INET, LastIP.c_str(), &ServerAddr.sin_addr); + ServerAddr.sin6_family = AF_INET6; + ServerAddr.sin6_port = htons(LastPort); + inet_pton(AF_INET6, LastIP.c_str(), &ServerAddr.sin6_addr); if (connect(DSock, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr)) != 0) { KillSocket(DSock); Terminate = true; diff --git a/src/Network/VehicleData.cpp b/src/Network/VehicleData.cpp index c1b309aa..06557c35 100644 --- a/src/Network/VehicleData.cpp +++ b/src/Network/VehicleData.cpp @@ -24,7 +24,7 @@ #include SOCKET UDPSock = -1; -sockaddr_in* ToServer = nullptr; +sockaddr_in6* ToServer = nullptr; void UDPSend(std::string Data) { if (ClientID == -1 || UDPSock == -1) @@ -62,7 +62,7 @@ void UDPParser(std::string_view Packet) { } } void UDPRcv() { - sockaddr_in FromServer {}; + sockaddr_in6 FromServer {}; #if defined(_WIN32) int clientLength = sizeof(FromServer); #elif defined(__linux__) @@ -88,11 +88,11 @@ void UDPClientMain(const std::string& IP, int Port) { #endif delete ToServer; - ToServer = new sockaddr_in; - ToServer->sin_family = AF_INET; - ToServer->sin_port = htons(Port); - inet_pton(AF_INET, IP.c_str(), &ToServer->sin_addr); - UDPSock = socket(AF_INET, SOCK_DGRAM, 0); + ToServer = new sockaddr_in6; + ToServer->sin6_family = AF_INET6; + ToServer->sin6_port = htons(Port); + inet_pton(AF_INET6, IP.c_str(), &ToServer->sin6_addr); + UDPSock = socket(AF_INET6, SOCK_DGRAM, 0); if (!magic.empty()) for (int i = 0; i < 10; i++) UDPSend(magic); diff --git a/src/Network/VehicleEvent.cpp b/src/Network/VehicleEvent.cpp index cecacea3..ff9c65a1 100644 --- a/src/Network/VehicleEvent.cpp +++ b/src/Network/VehicleEvent.cpp @@ -151,13 +151,13 @@ std::string TCPRcv(SOCKET Sock) { void TCPClientMain(const std::string& IP, int Port) { LastIP = IP; LastPort = Port; - SOCKADDR_IN ServerAddr; + SOCKADDR_IN6 ServerAddr; int RetCode; #ifdef _WIN32 WSADATA wsaData; WSAStartup(514, &wsaData); // 2.2 #endif - TCPSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + TCPSock = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); if (TCPSock == -1) { printf("Client: socket failed! Error code: %d\n", WSAGetLastError()); @@ -165,9 +165,9 @@ void TCPClientMain(const std::string& IP, int Port) { return; } - ServerAddr.sin_family = AF_INET; - ServerAddr.sin_port = htons(Port); - inet_pton(AF_INET, IP.c_str(), &ServerAddr.sin_addr); + ServerAddr.sin6_family = AF_INET6; + ServerAddr.sin6_port = htons(Port); + inet_pton(AF_INET6, IP.c_str(), &ServerAddr.sin6_addr); RetCode = connect(TCPSock, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr)); if (RetCode != 0) { UlStatus = "UlConnection Failed!";