aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--udpserver.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/udpserver.c b/udpserver.c
index 4bf6dee..e147b00 100644
--- a/udpserver.c
+++ b/udpserver.c
@@ -173,7 +173,6 @@ static int udpserver__find_sender(t_udpserver*x, unsigned long host, unsigned s
static t_udpserver_sender* udpserver_sender_add(t_udpserver*x,
unsigned long host, unsigned short port )
{
-
int id=-1;
if(!x->x_accept)return NULL;
@@ -181,6 +180,18 @@ static t_udpserver_sender* udpserver_sender_add(t_udpserver*x,
id=udpserver__find_sender(x, host, port);
DEBUG("%X:%d -> %d", host, port, id);
if(id<0) {
+#if 1
+ /* since udp is a connection-less protocol we have no way of knowing the currently connected clients
+ * the following 3 lines assume, that there is only one client connected (the last we got data from
+ */
+ id=0;
+ udpserver_sender_free(x->x_sr[id]);
+ x->x_sr[id]=udpserver_sender_new(x, host, port);
+#else
+ /* this is a more optimistic approach as above:
+ * every client that we received data from is added to the list of receivers
+ * the idea is to remove the sender, if it's known to not receive any data
+ */
id=x->x_nconnections;
/* an unknown address! add it */
if(id<MAX_CONNECT) {
@@ -191,8 +202,9 @@ static t_udpserver_sender* udpserver_sender_add(t_udpserver*x,
// oops, no more senders!
id=-1;
}
+#endif
}
-
+ DEBUG("sender_add: %d", id);
if(id>=0) {
return x->x_sr[id];
}
@@ -545,7 +557,9 @@ static void udpserver_receive_callback(void *y, t_iemnet_chunk*c) {
if(c) {
int conns = x->x_nconnections;
+ DEBUG("add new sender from %d", c->port);
t_udpserver_sender*sdr=udpserver_sender_add(x, c->addr, c->port);
+ DEBUG("added new sender from %d", c->port);
if(sdr) {
udpserver_info_connection(x, sdr);
x->x_floatlist=iemnet__chunk2list(c, x->x_floatlist); // gets destroyed in the dtor