$ git clone https://socialnetwork.ion.nu/socialnetwork.git
commit 3497ec203c049e39c7289d8d6341dff9ed897dc4
Author: Alicia <...>
Date:   Tue Jan 3 21:18:13 2017 +0100

    Added udpstream_getaddr() to get the address of a stream's peer, useful for UDP-punchthrough.

diff --git a/udpstream.c b/udpstream.c
index 4a9a316..8b3c6c8 100644
--- a/udpstream.c
+++ b/udpstream.c
@@ -254,3 +254,9 @@ void udpstream_listen(int sock, struct sockaddr* addr, socklen_t addrlen)
 {
   bind(sock, addr, addrlen);
 }
+
+void udpstream_getaddr(struct udpstream* stream, struct sockaddr* addr, socklen_t* addrlen)
+{
+  if(*addrlen>stream->addrlen){*addrlen=stream->addrlen;}
+  memcpy(addr, &stream->addr, *addrlen);
+}
diff --git a/udpstream.h b/udpstream.h
index 7cfec94..f5a2744 100644
--- a/udpstream.h
+++ b/udpstream.h
@@ -29,3 +29,6 @@ extern ssize_t udpstream_read(struct udpstream* stream, void* buf, size_t size);
 extern ssize_t udpstream_write(struct udpstream* stream, void* buf, size_t size);
 
 extern void udpstream_listen(int sock, struct sockaddr* addr, socklen_t addrlen);
+
+// Get the network address of a stream's peer (useful for UDP-punchthrough)
+extern void udpstream_getaddr(struct udpstream* stream, struct sockaddr* addr, socklen_t* addrlen);
diff --git a/udptest.c b/udptest.c
index 0dd3b0f..56a3c9f 100644
--- a/udptest.c
+++ b/udptest.c
@@ -37,7 +37,7 @@ int main(int argc, char** argv)
   else if(argc>1)
   {
     struct addrinfo* ai;
-    getaddrinfo("127.0.0.1", argv[1], 0, &ai);
+    getaddrinfo("0.0.0.0", argv[1], 0, &ai);
     udpstream_listen(sock, ai->ai_addr, ai->ai_addrlen);
     freeaddrinfo(ai);
   }
@@ -60,6 +60,14 @@ int main(int argc, char** argv)
       struct udpstream* rstream;
       while((rstream=udpstream_poll()))
       {
+        struct sockaddr_in addr;
+        socklen_t addrlen=sizeof(addr);
+        udpstream_getaddr(rstream, (struct sockaddr*)&addr, &addrlen);
+        if(addr.sin_family==AF_INET)
+        {
+          uint32_t ip=addr.sin_addr.s_addr;
+          printf("From: %u.%u.%u.%u:%hu:\n", ip%0x100, (ip/0x100)%0x100, (ip/0x10000)%0x100, ip/0x1000000, ntohs(addr.sin_port));
+        }
         stream=rstream;
         ssize_t len=udpstream_read(rstream, buf, 1024);
         if(len<1){continue;}