diff options
| author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2025-12-23 16:07:51 +0100 |
|---|---|---|
| committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2025-12-23 16:55:55 +0100 |
| commit | 646a7b1ed44decdb6aff868633419dbf3f3d95d1 (patch) | |
| tree | 208b765bcc6c8c610eed517565e34921043fa75a /lib | |
| parent | 802155fe01ea0cfdd3102f4688094a3925b6a4e6 (diff) | |
| download | dabmux-646a7b1ed44decdb6aff868633419dbf3f3d95d1.tar.gz dabmux-646a7b1ed44decdb6aff868633419dbf3f3d95d1.tar.bz2 dabmux-646a7b1ed44decdb6aff868633419dbf3f3d95d1.zip | |
Add remote address to stats
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Json.h | 18 | ||||
| -rw-r--r-- | lib/Socket.cpp | 32 |
2 files changed, 45 insertions, 5 deletions
@@ -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() { } |
