diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/BootstrapConnection.cpp | 6 | ||||
-rw-r--r-- | src/DirectConnection.cpp | 18 | ||||
-rw-r--r-- | src/IpAddress.cpp | 172 |
3 files changed, 182 insertions, 14 deletions
diff --git a/src/BootstrapConnection.cpp b/src/BootstrapConnection.cpp index 4876b7b..4ace97c 100644 --- a/src/BootstrapConnection.cpp +++ b/src/BootstrapConnection.cpp @@ -30,7 +30,7 @@ namespace sibs } }); - PubSubResult connectResult = PubSubResult::OK; + PubSubResult connectResult = PubSubResult::RESULT_OK; std::string connectResultStr; bool connected = false; connections.connectServer(bootstrapAddress, [this, &connectResult, &connectResultStr, &connected](std::shared_ptr<DirectConnectionPeer> peer, PubSubResult result, const std::string &resultStr) @@ -46,7 +46,7 @@ namespace sibs std::this_thread::sleep_for(std::chrono::milliseconds(10)); } - if(connectResult != PubSubResult::OK) + if(connectResult != PubSubResult::RESULT_OK) { std::string errMsg = "Failed to connect to bootstrap node, error: "; errMsg += connectResultStr; @@ -122,7 +122,7 @@ namespace sibs Log::debug("BootstrapConnection::receiveDataFromServer: received subscriber (ip: %s, port: %d) from bootstrap node", newPeerAddress.getAddress().c_str(), newPeerAddress.getPort()); connections.connect(newPeerAddress, [this, pubsubKey](std::shared_ptr<DirectConnectionPeer> peer, PubSubResult result, const std::string &resultStr) { - if(result == PubSubResult::OK) + if(result == PubSubResult::RESULT_OK) { std::lock_guard<std::recursive_mutex> lock(subscribeDataMutex); auto subscribeDataIt = subscribeData.find(pubsubKey); diff --git a/src/DirectConnection.cpp b/src/DirectConnection.cpp index 4795da1..b548a02 100644 --- a/src/DirectConnection.cpp +++ b/src/DirectConnection.cpp @@ -77,7 +77,7 @@ namespace sibs // For better performance, modify HKLM\System\CurrentControlSet\Services\Afd\Parameters\FastSendDatagramThreshold #ifdef WIN32 int mss = 1052; - UDT::setsockopt(socket, 0, UDT_MSS, &mss, sizeof(mss)); + UDT::setsockopt(udtSocket, 0, UDT_MSS, &mss, sizeof(mss)); #endif if(rendezvous || bind) @@ -153,16 +153,16 @@ namespace sibs catch(SocketCreateException &e) { if(connectCallbackFunc) - connectCallbackFunc(peer, PubSubResult::ERROR, e.what()); - return PubSubConnectResult { peer, PubSubResult::ERROR, e.what() }; + connectCallbackFunc(peer, PubSubResult::RESULT_ERROR, e.what()); + return PubSubConnectResult { peer, PubSubResult::RESULT_ERROR, e.what() }; } Log::debug("DirectConnections: Connecting to peer (ip: %s, port: %d, rendezvous: %s)", address.getAddress().c_str(), address.getPort(), rendezvous ? "yes" : "no"); if(UDT::connect(socket->udtSocket, (sockaddr*)&address.address, sizeof(address.address)) == UDT::ERROR) { if(connectCallbackFunc) - connectCallbackFunc(peer, PubSubResult::ERROR, UDT::getlasterror_desc()); - return PubSubConnectResult{ peer, PubSubResult::ERROR, UDT::getlasterror_desc() }; + connectCallbackFunc(peer, PubSubResult::RESULT_ERROR, UDT::getlasterror_desc()); + return PubSubConnectResult{ peer, PubSubResult::RESULT_ERROR, UDT::getlasterror_desc() }; } UDT::epoll_add_usock(eid, socket->udtSocket); @@ -175,8 +175,8 @@ namespace sibs peersMutex.unlock(); if(connectCallbackFunc) - connectCallbackFunc(peer, PubSubResult::OK, ""); - return PubSubConnectResult { peer, PubSubResult::OK, "" }; + connectCallbackFunc(peer, PubSubResult::RESULT_OK, ""); + return PubSubConnectResult { peer, PubSubResult::RESULT_OK, "" }; }); connectionResultsMutex.unlock(); } @@ -205,10 +205,10 @@ namespace sibs if(sentSize == UDT::ERROR) { if(sendDataCallbackFunc) - sendDataCallbackFunc(PubSubResult::ERROR, UDT::getlasterror_desc()); + sendDataCallbackFunc(PubSubResult::RESULT_ERROR, UDT::getlasterror_desc()); } else if(sendDataCallbackFunc) - sendDataCallbackFunc(PubSubResult::OK, ""); + sendDataCallbackFunc(PubSubResult::RESULT_OK, ""); }).detach(); return true; } diff --git a/src/IpAddress.cpp b/src/IpAddress.cpp index 58ed661..75e4348 100644 --- a/src/IpAddress.cpp +++ b/src/IpAddress.cpp @@ -1,6 +1,171 @@ #include "../include/sibs/IpAddress.hpp" #include <cstring> +#if OS_FAMILY == OS_FAMILY_WINDOWS +// Source: https://stackoverflow.com/questions/15370033/how-to-use-inet-pton-with-the-mingw-compiler +#define NS_INADDRSZ 4 +#define NS_IN6ADDRSZ 16 +#define NS_INT16SZ 2 + +int inet_pton(int af, const char *src, void *dst) +{ + switch (af) + { + case AF_INET: + return inet_pton4(src, dst); + case AF_INET6: + return inet_pton6(src, dst); + default: + return -1; + } +} + +int inet_pton4(const char *src, void *_dst) +{ + char *dst = (char*)_dst; + uint8_t tmp[NS_INADDRSZ], *tp; + + int saw_digit = 0; + int octets = 0; + *(tp = tmp) = 0; + + int ch; + while ((ch = *src++) != '\0') + { + if (ch >= '0' && ch <= '9') + { + uint32_t n = *tp * 10 + (ch - '0'); + + if (saw_digit && *tp == 0) + return 0; + + if (n > 255) + return 0; + + *tp = n; + if (!saw_digit) + { + if (++octets > 4) + return 0; + saw_digit = 1; + } + } + else if (ch == '.' && saw_digit) + { + if (octets == 4) + return 0; + *++tp = 0; + saw_digit = 0; + } + else + return 0; + } + if (octets < 4) + return 0; + + memcpy(dst, tmp, NS_INADDRSZ); + + return 1; +} + +int inet_pton6(const char *src, void *_dst) +{ + char *dst = (char*)_dst; + static const char xdigits[] = "0123456789abcdef"; + uint8_t tmp[NS_IN6ADDRSZ]; + + uint8_t *tp = (uint8_t*) memset(tmp, '\0', NS_IN6ADDRSZ); + uint8_t *endp = tp + NS_IN6ADDRSZ; + uint8_t *colonp = NULL; + + /* Leading :: requires some special handling. */ + if (*src == ':') + { + if (*++src != ':') + return 0; + } + + const char *curtok = src; + int saw_xdigit = 0; + uint32_t val = 0; + int ch; + while ((ch = tolower(*src++)) != '\0') + { + const char *pch = strchr(xdigits, ch); + if (pch != NULL) + { + val <<= 4; + val |= (pch - xdigits); + if (val > 0xffff) + return 0; + saw_xdigit = 1; + continue; + } + if (ch == ':') + { + curtok = src; + if (!saw_xdigit) + { + if (colonp) + return 0; + colonp = tp; + continue; + } + else if (*src == '\0') + { + return 0; + } + if (tp + NS_INT16SZ > endp) + return 0; + *tp++ = (uint8_t) (val >> 8) & 0xff; + *tp++ = (uint8_t) val & 0xff; + saw_xdigit = 0; + val = 0; + continue; + } + if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && + inet_pton4(curtok, (char*) tp) > 0) + { + tp += NS_INADDRSZ; + saw_xdigit = 0; + break; /* '\0' was seen by inet_pton4(). */ + } + return 0; + } + if (saw_xdigit) + { + if (tp + NS_INT16SZ > endp) + return 0; + *tp++ = (uint8_t) (val >> 8) & 0xff; + *tp++ = (uint8_t) val & 0xff; + } + if (colonp != NULL) + { + /* + * Since some memmove()'s erroneously fail to handle + * overlapping regions, we'll do the shift by hand. + */ + const int n = tp - colonp; + + if (tp == endp) + return 0; + + for (int i = 1; i <= n; i++) + { + endp[-i] = colonp[n - i]; + colonp[n - i] = 0; + } + tp = endp; + } + if (tp != endp) + return 0; + + memcpy(dst, tmp, NS_IN6ADDRSZ); + + return 1; +} +#endif + namespace sibs { Ipv4::Ipv4() : Ipv4(nullptr, 0) @@ -44,8 +209,11 @@ namespace sibs std::string Ipv4::getAddress() const { std::string result; - result.resize(INET_ADDRSTRLEN); - inet_ntop(AF_INET, &address.sin_addr, &result[0], INET_ADDRSTRLEN); + const int addrLen = sizeof(address); + char host[NI_MAXHOST]; + char service[NI_MAXSERV]; + getnameinfo((sockaddr *)&address, addrLen, host, sizeof(host), service, sizeof(service), NI_NUMERICHOST | NI_NUMERICSERV); + result += host; return result; } |