From f28bdb390c81800ed9eb47803216c76327a4f682 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Fri, 26 Mar 2010 14:31:28 +0000 Subject: changed API of read-callback the callback will provide the raw data chunk as well (easier to add more data) svn path=/trunk/externals/iem/iemnet/; revision=13273 --- iemnet.c | 68 +++++++++++++++++++++++++++---------------------------------- iemnet.h | 9 ++++++-- tcpclient.c | 10 +++++---- tcpserver.c | 9 +++++--- 4 files changed, 49 insertions(+), 47 deletions(-) diff --git a/iemnet.c b/iemnet.c index 1e786c9..e5cb9be 100644 --- a/iemnet.c +++ b/iemnet.c @@ -118,42 +118,38 @@ t_iemnet_chunk* iemnet__chunk_create_empty(int size) { } memset(result->data, 0, result->size); + + result->addr=0L; + result->port=0; + } return result; } t_iemnet_chunk* iemnet__chunk_create_data(int size, unsigned char*data) { - t_iemnet_chunk*result=(t_iemnet_chunk*)getbytes(sizeof(t_iemnet_chunk)); + t_iemnet_chunk*result=iemnet__chunk_create_empty(size); if(result) { - result->size=size; - result->data=(unsigned char*)getbytes(sizeof(unsigned char)*size); - - if(NULL == result->data) { - result->size=0; - iemnet__chunk_destroy(result); - return NULL; - } - memcpy(result->data, data, result->size); } return result; } +t_iemnet_chunk* iemnet__chunk_create_dataaddr(int size, + unsigned char*data, + struct sockaddr_in*addr) { + t_iemnet_chunk*result=iemnet__chunk_create_data(size, data); + if(addr) { + result->addr = ntohl(addr->sin_addr.s_addr); + result->port = ntohs(addr->sin_port); + } + return result; +} t_iemnet_chunk* iemnet__chunk_create_list(int argc, t_atom*argv) { - t_iemnet_chunk*result=(t_iemnet_chunk*)getbytes(sizeof(t_iemnet_chunk)); int i; + t_iemnet_chunk*result=iemnet__chunk_create_empty(argc); if(NULL==result)return NULL; - result->size=argc; - result->data=(unsigned char*)getbytes(sizeof(unsigned char)*argc); - - if(NULL == result->data) { - result->size=0; - iemnet__chunk_destroy(result); - return NULL; - } - for(i=0; idata[i]=c; @@ -166,18 +162,9 @@ t_iemnet_chunk* iemnet__chunk_create_list(int argc, t_atom*argv) { t_iemnet_chunk*iemnet__chunk_create_chunk(t_iemnet_chunk*c) { t_iemnet_chunk*result=NULL; if(NULL==c)return NULL; - - result=(t_iemnet_chunk*)getbytes(sizeof(t_iemnet_chunk)); - - result->size=c->size; - result->data=(unsigned char*)getbytes(sizeof(unsigned char)*(result->size)); - if(NULL == result->data) { - result->size=0; - iemnet__chunk_destroy(result); - return NULL; - } - - memcpy(result->data, c->data, result->size); + result=iemnet__chunk_create_data(c->size, c->data); + result->addr=c->addr; + result->port=c->port; return result; } @@ -515,18 +502,23 @@ static void*iemnet__receiver_readthread(void*arg) { unsigned char data[INBUFSIZE]; unsigned int size=INBUFSIZE; + struct sockaddr_in from; + socklen_t fromlen = sizeof(from); + unsigned int i=0; for(i=0; irunning=1; while(1) { t_iemnet_chunk*c=NULL; + fromlen = sizeof(from); //fprintf(stderr, "reading %d bytes...\n", size); - result = recv(sockfd, data, size, 0); + //result = recv(sockfd, data, size, 0); + result = recvfrom(sockfd, data, size, 0, (struct sockaddr *)&from, &fromlen); //fprintf(stderr, "read %d bytes...\n", result); - + if(result<=0)break; - c= iemnet__chunk_create_data(result, data); - + c= iemnet__chunk_create_dataaddr(result, data, &from); + queue_push(q, c); if(receiver->clock)clock_delay(receiver->clock, 0); @@ -548,13 +540,13 @@ static void iemnet__receiver_tick(t_iemnet_receiver *x) t_iemnet_chunk*c=queue_pop_noblock(x->queue); while(NULL!=c) { x->flist = iemnet__chunk2list(c, x->flist); - (x->callback)(x->userdata, x->flist->argc, x->flist->argv); + (x->callback)(x->userdata, c, x->flist->argc, x->flist->argv); iemnet__chunk_destroy(c); c=queue_pop_noblock(x->queue); } if(!x->running) { // read terminated - x->callback(x->userdata, 0, NULL); + x->callback(x->userdata, NULL, 0, NULL); } } diff --git a/iemnet.h b/iemnet.h index fae3ad6..144bfda 100644 --- a/iemnet.h +++ b/iemnet.h @@ -54,13 +54,16 @@ EXTERN void sys_rmpollfn(int fd); typedef struct _iemnet_chunk { unsigned char* data; - size_t size; + + long addr; + unsigned short port; } t_iemnet_chunk; void iemnet__chunk_destroy(t_iemnet_chunk*); t_iemnet_chunk*iemnet__chunk_create_empty(int); t_iemnet_chunk*iemnet__chunk_create_data(int, unsigned char*); +t_iemnet_chunk*iemnet__chunk_create_dataaddr(int, unsigned char*, struct sockaddr_in*addr); t_iemnet_chunk*iemnet__chunk_create_list(int, t_atom*); t_iemnet_chunk*iemnet__chunk_create_chunk(t_iemnet_chunk*); @@ -82,7 +85,9 @@ int iemnet__sender_setsockopt(t_iemnet_sender*, int level, int optname, const vo #define t_iemnet_receiver struct _iemnet_receiver EXTERN_STRUCT _iemnet_receiver; -typedef void (*t_iemnet_receivecallback)(void*data, int argc, t_atom*argv); +typedef void (*t_iemnet_receivecallback)(void*userdata, + t_iemnet_chunk*rawdata, + int argc, t_atom*argv); /** * create a receiver object: whenever something is received on the socket, diff --git a/tcpclient.c b/tcpclient.c index c7bffe2..1913c43 100644 --- a/tcpclient.c +++ b/tcpclient.c @@ -63,7 +63,9 @@ typedef struct _tcpclient } t_tcpclient; -static void tcpclient_receive_callback(t_tcpclient *x, int sockfd, int argc, t_atom*argv); +static void tcpclient_receive_callback(void *x, + t_iemnet_chunk*, + int argc, t_atom*argv); @@ -116,7 +118,7 @@ static void *tcpclient_child_connect(void *w) x->x_addr = ntohl(*(long *)hp->h_addr); x->x_sender=iemnet__sender_create(sockfd); - x->x_receiver=iemnet__receiver_create(sockfd, x, (t_iemnet_receivecallback)tcpclient_receive_callback); + x->x_receiver=iemnet__receiver_create(sockfd, x, tcpclient_receive_callback); x->x_connectstate = 1; @@ -178,8 +180,8 @@ static void tcpclient_send(t_tcpclient *x, t_symbol *s, int argc, t_atom *argv) outlet_anything( x->x_statusout, gensym("sent"), 1, &output_atom); } -static void tcpclient_receive_callback(t_tcpclient *x, int sockfd, int argc, t_atom*argv) { - // ignore sockfd +static void tcpclient_receive_callback(void*y, t_iemnet_chunk*c, int argc, t_atom*argv) { + t_tcpclient *x=(t_tcpclient*)y; if(argc) { outlet_list(x->x_msgout, gensym("list"), argc, argv); diff --git a/tcpserver.c b/tcpserver.c index 8e99eb7..e56748a 100644 --- a/tcpserver.c +++ b/tcpserver.c @@ -64,7 +64,7 @@ typedef struct _tcpserver t_atom x_addrbytes[4]; } t_tcpserver; -static void tcpserver_receive_callback(t_tcpserver_socketreceiver*x, int argc, t_atom*argv); +static void tcpserver_receive_callback(void*x, t_iemnet_chunk*,int argc, t_atom*argv); static t_tcpserver_socketreceiver *tcpserver_socketreceiver_new(t_tcpserver *owner, int sockfd, t_symbol*host) { @@ -79,7 +79,7 @@ static t_tcpserver_socketreceiver *tcpserver_socketreceiver_new(t_tcpserver *own x->sr_fd=sockfd; x->sr_sender=iemnet__sender_create(sockfd); - x->sr_receiver=iemnet__receiver_create(sockfd, x, (t_iemnet_receivecallback)tcpserver_receive_callback); + x->sr_receiver=iemnet__receiver_create(sockfd, x, tcpserver_receive_callback); } return (x); } @@ -300,7 +300,10 @@ static void tcpserver_disconnect_all(t_tcpserver *x) } /* ---------------- main tcpserver (receive) stuff --------------------- */ -static void tcpserver_receive_callback(t_tcpserver_socketreceiver *y, int argc, t_atom*argv) { +static void tcpserver_receive_callback(void *y0, + t_iemnet_chunk*c, + int argc, t_atom*argv) { + t_tcpserver_socketreceiver *y=(t_tcpserver_socketreceiver*)y0; t_tcpserver*x=NULL; if(NULL==y || NULL==(x=y->sr_owner))return; -- cgit v1.2.1