Add support for getting local IPv6 address

This commit is contained in:
Cameron Gutman 2019-07-29 21:01:55 -07:00
parent 8158c85a23
commit 46c2236342

View File

@ -488,36 +488,42 @@ bool TestAllPorts(PSOCKADDR_STORAGE addr, char* portMsg, int portMsgLen, bool co
return ret; return ret;
} }
bool FindLocalInterfaceIP4Address(PSOCKADDR_IN addr) bool FindLocalInterfaceIPAddress(int family, PSOCKADDR_STORAGE addr)
{ {
SOCKET s; SOCKET s;
struct hostent* host; struct addrinfo hint = {};
struct addrinfo* result;
int err;
fprintf(LOG_OUT, "Finding local IP address..."); fprintf(LOG_OUT, "Finding local %s address...", family == AF_INET ? "IPv4" : "IPv6");
host = gethostbyname("moonlight-stream.org"); hint.ai_family = family;
if (host == nullptr) { hint.ai_socktype = SOCK_STREAM;
fprintf(LOG_OUT, "gethostbyname() failed: %d\n", WSAGetLastError()); hint.ai_protocol = IPPROTO_TCP;
hint.ai_flags = AI_ADDRCONFIG;
err = getaddrinfo("moonlight-stream.org", "https", &hint, &result);
if (err != 0 || result == NULL) {
fprintf(LOG_OUT, "getaddrinfo() failed: %d\n", err);
return false; return false;
} }
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); s = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (s == INVALID_SOCKET) { if (s == INVALID_SOCKET) {
fprintf(LOG_OUT, "socket() failed: %d\n", WSAGetLastError()); fprintf(LOG_OUT, "socket() failed: %d\n", WSAGetLastError());
freeaddrinfo(result);
return false; return false;
} }
SOCKADDR_IN sin = {}; err = connect(s, (struct sockaddr*)result->ai_addr, result->ai_addrlen);
sin.sin_family = AF_INET;
sin.sin_port = htons(443);
sin.sin_addr = *(struct in_addr*)host->h_addr;
int err = connect(s, (struct sockaddr*)&sin, sizeof(sin));
if (err == SOCKET_ERROR) { if (err == SOCKET_ERROR) {
fprintf(LOG_OUT, "connect() failed: %d\n", WSAGetLastError()); fprintf(LOG_OUT, "connect() failed: %d\n", WSAGetLastError());
closesocket(s); closesocket(s);
freeaddrinfo(result);
return false; return false;
} }
freeaddrinfo(result);
// Determine which local interface we bound to // Determine which local interface we bound to
int nameLen = sizeof(*addr); int nameLen = sizeof(*addr);
err = getsockname(s, (struct sockaddr*)addr, &nameLen); err = getsockname(s, (struct sockaddr*)addr, &nameLen);
@ -527,8 +533,13 @@ bool FindLocalInterfaceIP4Address(PSOCKADDR_IN addr)
return false; return false;
} }
char addrStr[64]; char addrStr[INET6_ADDRSTRLEN];
inet_ntop(AF_INET, &addr->sin_addr, addrStr, sizeof(addrStr)); if (addr->ss_family == AF_INET) {
inet_ntop(AF_INET, &((struct sockaddr_in*)addr)->sin_addr, addrStr, sizeof(addrStr));
}
else {
inet_ntop(AF_INET6, &((struct sockaddr_in6*)addr)->sin6_addr, addrStr, sizeof(addrStr));
}
fprintf(LOG_OUT, "%s\n", addrStr); fprintf(LOG_OUT, "%s\n", addrStr);
return true; return true;
@ -823,7 +834,7 @@ int main(int argc, char* argv[])
return -1; return -1;
} }
if (!FindLocalInterfaceIP4Address(&sin)) { if (!FindLocalInterfaceIPAddress(AF_INET, &ss)) {
DisplayMessage("Unable to perform GameStream connectivity check. Please check your Internet connection and try again."); DisplayMessage("Unable to perform GameStream connectivity check. Please check your Internet connection and try again.");
return -1; return -1;
} }
@ -883,7 +894,7 @@ int main(int argc, char* argv[])
hint.ai_flags = AI_ADDRCONFIG; hint.ai_flags = AI_ADDRCONFIG;
err = getaddrinfo("loopback.moonlight-stream.org", NULL, &hint, &result); err = getaddrinfo("loopback.moonlight-stream.org", NULL, &hint, &result);
if (err != 0 || result == NULL) { if (err != 0 || result == NULL) {
fprintf(LOG_OUT, "getaddrinfo() failed: %d\n", WSAGetLastError()); fprintf(LOG_OUT, "getaddrinfo() failed: %d\n", err);
} }
else { else {
// First try the relay server over IPv4. If this passes, it's considered a full success // First try the relay server over IPv4. If this passes, it's considered a full success