diff options
-rw-r--r-- | iemnet_data.c | 10 | ||||
-rw-r--r-- | iemnet_data.h | 9 | ||||
-rw-r--r-- | iemnet_receiver.c | 9 | ||||
-rw-r--r-- | iemnet_sender.c | 10 | ||||
-rw-r--r-- | tcpclient.c | 27 | ||||
-rw-r--r-- | tcpserver.c | 12 |
6 files changed, 75 insertions, 2 deletions
diff --git a/iemnet_data.c b/iemnet_data.c index ce19693..5dc7ee5 100644 --- a/iemnet_data.c +++ b/iemnet_data.c @@ -296,7 +296,15 @@ t_iemnet_chunk* queue_pop(t_iemnet_queue* const _this) { return queue_pop_block(_this); } - +int queue_getsize(t_iemnet_queue* const _this) { + int size=-1; + if(_this) { + pthread_mutex_lock(&_this->mtx); + size=_this->size; + pthread_mutex_unlock(&_this->mtx); + } + return size; +} void queue_finish(t_iemnet_queue* q) { DEBUG("queue_finish: %x", q); if(NULL==q) diff --git a/iemnet_data.h b/iemnet_data.h index 45d1487..6124a85 100644 --- a/iemnet_data.h +++ b/iemnet_data.h @@ -106,6 +106,15 @@ t_iemnet_chunk* queue_pop_block(t_iemnet_queue* const q); */ t_iemnet_chunk* queue_pop_noblock(t_iemnet_queue* const); /** + * get size if queue + * + * \param q the queue to get the size of + * \return the fill state of the queue, -1 if something goes wrong + * + * \note thread safe + */ +int queue_getsize(t_iemnet_queue* const q); +/** * initiate cleanup process * * unblocks all blocking calls to queue_pop_block(t_iemnet_queue* const q); diff --git a/iemnet_receiver.c b/iemnet_receiver.c index 5359f65..d161354 100644 --- a/iemnet_receiver.c +++ b/iemnet_receiver.c @@ -126,6 +126,15 @@ static void iemnet__receiver_tick(t_iemnet_receiver *x) } } +int iemnet__receiver_getsize(t_iemnet_receiver*x) { + int size=-1; + if(x && x->queue) + size=queue_getsize(x->queue); + + return size; +} + + t_iemnet_receiver*iemnet__receiver_create(int sock, void*userdata, t_iemnet_receivecallback callback) { static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; t_iemnet_receiver*rec=(t_iemnet_receiver*)getbytes(sizeof(t_iemnet_receiver)); diff --git a/iemnet_sender.c b/iemnet_sender.c index eb1ec3b..0d6701c 100644 --- a/iemnet_sender.c +++ b/iemnet_sender.c @@ -162,3 +162,13 @@ int iemnet__sender_setsockopt(t_iemnet_sender*s, int level, int optname, const v } return result; } + + + +int iemnet__sender_getsize(t_iemnet_sender*x) { + int size=-1; + if(x && x->queue) + size=queue_getsize(x->queue); + + return size; +} diff --git a/tcpclient.c b/tcpclient.c index d177f89..013fb75 100644 --- a/tcpclient.c +++ b/tcpclient.c @@ -68,6 +68,31 @@ static void tcpclient_receive_callback(void *x, +static void tcpclient_info(t_tcpclient *x) +{ + // "server <socket> <IP> <port>" + // "bufsize <insize> <outsize>" + static t_atom output_atom[3]; + if(x&&x->x_connectstate) { + int sockfd = x->x_fd; + unsigned short port = x->x_port; + const char*hostname=x->x_hostname; + + int insize =iemnet__receiver_getsize(x->x_receiver); + int outsize=iemnet__sender_getsize (x->x_sender ); + + SETFLOAT (output_atom+0, sockfd); + SETSYMBOL(output_atom+1, gensym(hostname)); + SETFLOAT (output_atom+2, port); + + outlet_anything( x->x_statusout, gensym("server"), 3, output_atom); + + SETFLOAT (output_atom+0, insize); + SETFLOAT (output_atom+1, outsize); + outlet_anything( x->x_statusout, gensym("bufsize"), 2, output_atom); + } +} + /* connection handling */ static void *tcpclient_child_connect(void *w) @@ -247,6 +272,8 @@ IEMNET_EXTERN void tcpclient_setup(void) class_addmethod(tcpclient_class, (t_method)tcpclient_send, gensym("send"), A_GIMME, 0); class_addlist(tcpclient_class, (t_method)tcpclient_send); + class_addbang(tcpclient_class, (t_method)tcpclient_info); + diff --git a/tcpserver.c b/tcpserver.c index ff78d84..8e3dfb3 100644 --- a/tcpserver.c +++ b/tcpserver.c @@ -152,13 +152,18 @@ static int tcpserver_fixindex(t_tcpserver*x, int client) /* ---------------- tcpserver info ---------------------------- */ static void tcpserver_info_client(t_tcpserver *x, int client) { - // "client <id> <socket> <IP> <port> + // "client <id> <socket> <IP> <port>" + // "bufsize <id> <insize> <outsize>" static t_atom output_atom[4]; if(x&&x->x_sr&&x->x_sr[client]) { int sockfd = x->x_sr[client]->sr_fd; unsigned short port = x->x_sr[client]->sr_port; long address = x->x_sr[client]->sr_host; char hostname[MAXPDSTRING]; + + int insize =iemnet__receiver_getsize(x->x_sr[client]->sr_receiver); + int outsize=iemnet__sender_getsize (x->x_sr[client]->sr_sender ); + snprintf(hostname, MAXPDSTRING-1, "%d.%d.%d.%d", (address & 0xFF000000)>>24, (address & 0x0FF0000)>>16, @@ -172,6 +177,11 @@ static void tcpserver_info_client(t_tcpserver *x, int client) SETFLOAT (output_atom+3, port); outlet_anything( x->x_statout, gensym("client"), 4, output_atom); + + SETFLOAT (output_atom+0, client+1); + SETFLOAT (output_atom+1, insize); + SETFLOAT (output_atom+2, outsize); + outlet_anything( x->x_statout, gensym("bufsize"), 3, output_atom); } } |