aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Socket.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Socket.cpp')
-rw-r--r--lib/Socket.cpp32
1 files changed, 27 insertions, 5 deletions
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() { }