$ 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;}