aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--iemnet.c68
-rw-r--r--iemnet.h9
-rw-r--r--tcpclient.c10
-rw-r--r--tcpserver.c9
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; i<argc; i++) {
unsigned char c = atom_getint(argv);
result->data[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; i<size; i++)data[i]=0;
receiver->running=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;