aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/BootstrapConnection.cpp6
-rw-r--r--src/DirectConnection.cpp18
-rw-r--r--src/IpAddress.cpp172
3 files changed, 182 insertions, 14 deletions
diff --git a/src/BootstrapConnection.cpp b/src/BootstrapConnection.cpp
index d7cee09..d0731b9 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 3ffff22..8243b50 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();
}
@@ -199,10 +199,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;
}