aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2025-12-23 16:07:51 +0100
committerMatthias P. Braendli <matthias.braendli@mpb.li>2025-12-23 16:55:55 +0100
commit646a7b1ed44decdb6aff868633419dbf3f3d95d1 (patch)
tree208b765bcc6c8c610eed517565e34921043fa75a /lib
parent802155fe01ea0cfdd3102f4688094a3925b6a4e6 (diff)
downloaddabmux-646a7b1ed44decdb6aff868633419dbf3f3d95d1.tar.gz
dabmux-646a7b1ed44decdb6aff868633419dbf3f3d95d1.tar.bz2
dabmux-646a7b1ed44decdb6aff868633419dbf3f3d95d1.zip
Add remote address to stats
Diffstat (limited to 'lib')
-rw-r--r--lib/Json.h18
-rw-r--r--lib/Socket.cpp32
2 files changed, 45 insertions, 5 deletions
diff --git a/lib/Json.h b/lib/Json.h
index a40b41f..8a1a63d 100644
--- a/lib/Json.h
+++ b/lib/Json.h
@@ -57,6 +57,24 @@ namespace json {
bool,
std::nullopt_t> v;
+ explicit value_t() {
+ v = std::nullopt;
+ }
+
+ explicit value_t(const std::unordered_map<std::string, value_t>& object) {
+ v = std::make_shared<std::unordered_map<std::string, value_t> >(
+ object);
+ }
+
+ explicit value_t(const std::vector<value_t>& array) {
+ v = array;
+ }
+
+ value_t(const std::string& str) {
+ v = str;
+ }
+
+
void operator=(const std::unordered_map<std::string, value_t>& object) {
v = std::make_shared<std::unordered_map<std::string, value_t> >(
object);
diff --git a/lib/Socket.cpp b/lib/Socket.cpp
index 33c9c73..da9031f 100644
--- a/lib/Socket.cpp
+++ b/lib/Socket.cpp
@@ -71,13 +71,35 @@ void InetAddress::resolveUdpDestination(const std::string& destination, int port
string InetAddress::to_string() const
{
char received_from_str[64] = {};
- sockaddr *addr = reinterpret_cast<sockaddr*>(&addr);
- const char* ret = inet_ntop(AF_INET, addr, received_from_str, 63);
- if (ret == nullptr) {
- throw invalid_argument(string("Error converting InetAddress") + strerror(errno));
+ if (addr.ss_family == AF_INET) {
+ const sockaddr_in *s = reinterpret_cast<const sockaddr_in*>(&addr);
+ const char *ret = inet_ntop(AF_INET, &s->sin_addr, received_from_str, 63);
+
+ if (ret == nullptr) {
+ throw invalid_argument(string("Error converting AF_INET InetAddress") + strerror(errno));
+ }
+
+ auto port = ntohs(s->sin_port);
+
+ return string(ret) + ":" + std::to_string(port);
+ }
+ else if (addr.ss_family == AF_INET6) {
+ const sockaddr_in6 *s = reinterpret_cast<const sockaddr_in6*>(&addr);
+ const char *ret = inet_ntop(AF_INET6, &s->sin6_addr, received_from_str, 63);
+
+ if (ret == nullptr) {
+ throw invalid_argument(string("Error converting AF_INET6 InetAddress") + strerror(errno));
+ }
+
+ auto port = ntohs(s->sin6_port);
+
+ return string(ret) + ":" + std::to_string(port);
+ }
+ else {
+ fprintf(stderr, "Unknown AF %u\n", addr.ss_family);
+ return "";
}
- return ret;
}
UDPPacket::UDPPacket() { }