diff --git a/socket/include/socket.h b/socket/include/socket.h index 5e54946..2b44b0e 100644 --- a/socket/include/socket.h +++ b/socket/include/socket.h @@ -17,12 +17,9 @@ #include #include -#ifdef IBM -#endif -#ifdef APL -#endif #ifdef LIN #include +#include #include #include #include @@ -44,6 +41,8 @@ class Socket #ifdef LIN void logSSL(); + void *getSinAddr(addrinfo *addr); + in_addr_t resolveHost(const char *host); #endif public: diff --git a/socket/socket.cpp b/socket/socket.cpp index 0c06785..6c7860a 100644 --- a/socket/socket.cpp +++ b/socket/socket.cpp @@ -21,7 +21,7 @@ Socket::Socket(std::string url, std::function toLog) memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_addr.s_addr = - inet_addr("136.243.123.153"); // address of german-airlines.de + resolveHost("german-airlines.de"); // address of german-airlines.de sa.sin_port = htons(443); socklen_t socklen = sizeof(sa); if (connect(s, (struct sockaddr *)&sa, socklen)) { @@ -58,11 +58,15 @@ Socket::Socket(std::string url, std::function toLog) Socket::~Socket() { - // PLATFORM AGNOSTIC #ifdef IBM // WSA DEINIT int a = 0; #endif +#ifdef LIN + close(sock); + SSL_shutdown(ssl); + SSL_free(ssl); +#endif } void Socket::sendData(data d) @@ -102,4 +106,53 @@ void Socket::logSSL() toLog(str); } } + +void *Socket::getSinAddr(addrinfo *addr) +{ + switch (addr->ai_family) { + case AF_INET: + return &(reinterpret_cast(addr->ai_addr)->sin_addr); + case AF_INET6: + return &(reinterpret_cast(addr->ai_addr)->sin6_addr); + } + + return NULL; +} + +in_addr_t Socket::resolveHost(const char *host) +{ + addrinfo hints = {}; + hints.ai_flags = AI_CANONNAME; + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + + addrinfo *res; + + int ret = getaddrinfo(host, NULL, &hints, &res); + if (ret != 0) { + std::ostringstream msg; + msg << "getaddrinfo() failed: " << gai_strerror(ret); + toLog(msg.str()); + + return 0; + } else { + std::ostringstream msg; + msg << res->ai_canonname; + toLog(msg.str()); + + in_addr_t retVal = 0; + + for (addrinfo *addr = res; addr != NULL; addr = addr->ai_next) { + if (addr->ai_family == AF_INET) { + retVal = + (reinterpret_cast(addr->ai_addr))->sin_addr.s_addr; + break; + } + } + + freeaddrinfo(res); + return retVal; + } +} #endif \ No newline at end of file