From e6f799e41d7910e1388c68630c49bf3141cb8d9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Tue, 1 Sep 2015 14:30:54 +0000 Subject: sync with git svn path=/trunk/externals/iem/iemnet/; revision=17545 --- tcpserver.c | 104 ++++++++++++++++++++++++------------------------------------ 1 file changed, 42 insertions(+), 62 deletions(-) (limited to 'tcpserver.c') diff --git a/tcpserver.c b/tcpserver.c index ca4f38e..218b6ba 100644 --- a/tcpserver.c +++ b/tcpserver.c @@ -1,5 +1,5 @@ /* tcpserver.c - * copyright (c) 2010 IOhannes m zmölnig, IEM + * copyright © 2010-2015 IOhannes m zmölnig, IEM * copyright (c) 2006-2010 Martin Peach * copyright (c) 2004 Olaf Matthes */ @@ -71,6 +71,7 @@ typedef struct _tcpserver { t_iemnet_floatlist *x_floatlist; } t_tcpserver; +/* forward declarations */ static void tcpserver_receive_callback(void*x, t_iemnet_chunk*); static t_tcpserver_socketreceiver *tcpserver_socketreceiver_new( @@ -79,21 +80,19 @@ static t_tcpserver_socketreceiver *tcpserver_socketreceiver_new( t_tcpserver_socketreceiver *x = (t_tcpserver_socketreceiver *)getbytes( sizeof(*x)); if(NULL==x) { - error("%s_socketreceiver: unable to allocate %d bytes", objName, - (int)sizeof(*x)); + iemnet_log(x, IEMNET_FATAL, "unable to allocate %d bytes", (int)sizeof(*x)); return NULL; - } else { - x->sr_owner=owner; + } + x->sr_owner=owner; - x->sr_fd=sockfd; + x->sr_fd=sockfd; - x->sr_host=ntohl(addr->sin_addr.s_addr); - x->sr_port=ntohs(addr->sin_port); + x->sr_host=ntohl(addr->sin_addr.s_addr); + x->sr_port=ntohs(addr->sin_port); - x->sr_sender=iemnet__sender_create(sockfd, NULL, NULL, 0); - x->sr_receiver=iemnet__receiver_create(sockfd, x, - tcpserver_receive_callback, 0); - } + x->sr_sender=iemnet__sender_create(sockfd, NULL, NULL, 0); + x->sr_receiver=iemnet__receiver_create(sockfd, x, + tcpserver_receive_callback, 0); return (x); } @@ -111,7 +110,6 @@ static void tcpserver_socketreceiver_free(t_tcpserver_socketreceiver *x) x->sr_fd=-1; - if(sender) { iemnet__sender_destroy(sender, 0); } @@ -121,10 +119,9 @@ static void tcpserver_socketreceiver_free(t_tcpserver_socketreceiver *x) iemnet__closesocket(sockfd); - freebytes(x, sizeof(*x)); } - DEBUG("freeed %x", x); + DEBUG("freed %x", x); } static int tcpserver_socket2index(t_tcpserver*x, int sockfd) @@ -145,19 +142,19 @@ static int tcpserver_socket2index(t_tcpserver*x, int sockfd) static int tcpserver_fixindex(t_tcpserver*x, int client) { if(x->x_nconnections <= 0) { - pd_error(x, "[%s]: no clients connected", objName); + iemnet_log(x, IEMNET_ERROR, "no clients connected"); return -1; } - if (!((client > 0) && (client <= x->x_nconnections))) { - pd_error(x, "[%s] client %d out of range [1..%d]", objName, client, - (int)(x->x_nconnections)); + if (!((client > 0) && ((unsigned int)client <= x->x_nconnections))) { + iemnet_log(x, IEMNET_ERROR, + "client:%d out of range [1..%d]", + client, (int)(x->x_nconnections)); return -1; } return (client-1); } - /* ---------------- tcpserver info ---------------------------- */ static void tcpserver_info_client(t_tcpserver *x, unsigned int client) { @@ -194,18 +191,16 @@ static void tcpserver_info_client(t_tcpserver *x, unsigned int client) } } - static void tcpserver_info(t_tcpserver *x) { static t_atom output_atom[4]; int sockfd=x->x_connectsocket; - int port=x->x_port; if(sockfd<0) { - // no open port - post("no valid sock"); + iemnet_log(x, IEMNET_ERROR, "no open socket"); + return; } if(x->x_port<=0) { @@ -215,7 +210,9 @@ static void tcpserver_info(t_tcpserver *x) x->x_port=ntohs(server.sin_port); port=x->x_port; } else { - post("gesockname failed for %d", sockfd); + iemnet_log(x, IEMNET_ERROR, "unable to get socket name for %d", sockfd); + sys_sockerror("getsockname"); + return; } } @@ -223,7 +220,6 @@ static void tcpserver_info(t_tcpserver *x) outlet_anything( x->x_statout, gensym("port"), 1, output_atom); } - static void tcpserver_info_connection(t_tcpserver *x, t_tcpserver_socketreceiver*y) { @@ -375,9 +371,6 @@ static void tcpserver_broadcastbut(t_tcpserver *x, t_symbol *s, int argc, t_atom *argv) { int but=-1; - //int client=0; - // t_iemnet_chunk*chunk=NULL; - if(argc<2) { return; } @@ -398,8 +391,7 @@ static void tcpserver_defaultsend(t_tcpserver *x, t_symbol *s, int argc, tcpserver_send_toclient(x, client, argc, argv); return; } - pd_error(x, "[%s] illegal socket %d, switching to broadcast mode", objName, - sockfd); + iemnet_log(x, IEMNET_ERROR, "illegal socket:%d, switching to broadcast mode", sockfd); x->x_defaulttarget=0; } else if(sockfd<0) { client=tcpserver_socket2index(x, -sockfd); @@ -407,8 +399,7 @@ static void tcpserver_defaultsend(t_tcpserver *x, t_symbol *s, int argc, tcpserver_send_butclient(x, client, argc, argv); return; } - pd_error(x, "[%s] illegal !ocket %d, switching to broadcast mode", objName, - sockfd); + iemnet_log(x, IEMNET_ERROR, "illegal socket:%d excluded, switching to broadcast mode", sockfd); x->x_defaulttarget=0; } @@ -421,8 +412,9 @@ static void tcpserver_defaulttarget(t_tcpserver *x, t_floatarg f) unsigned int client=(rawclient<0)?(-rawclient):rawclient; if(client > x->x_nconnections) { - error("[%s] target %d out of range [0..%d]", objName, client, - (int)(x->x_nconnections)); + iemnet_log(x, IEMNET_ERROR, + "target %d out of range [0..%d]", + client, (int)(x->x_nconnections)); return; } @@ -443,8 +435,6 @@ static void tcpserver_targetsocket(t_tcpserver *x, t_floatarg f) x->x_defaulttarget=sockfd; } - - /* send message to client using socket number */ static void tcpserver_send_socket(t_tcpserver *x, t_symbol *s, int argc, t_atom *argv) @@ -457,7 +447,7 @@ static void tcpserver_send_socket(t_tcpserver *x, t_symbol *s, int argc, return; } } else { - pd_error(x, "%s_send: no socket specified", objName); + iemnet_log(x, IEMNET_ERROR, "no socket specified"); return; } @@ -466,11 +456,11 @@ static void tcpserver_send_socket(t_tcpserver *x, t_symbol *s, int argc, int sockfd=atom_getint(argv); client = tcpserver_socket2index(x, sockfd); if(client < 0) { - post("%s_send: no connection on socket %d", objName, sockfd); + iemnet_log(x, IEMNET_ERROR, "no connection on socket %d", sockfd); return; } } else { - post("%s_send: no socket specified", objName); + iemnet_log(x, IEMNET_ERROR, "only numeric sockets allowed"); return; } @@ -495,11 +485,9 @@ static void tcpserver_disconnect(t_tcpserver *x, unsigned int client) x->x_sr[k + 1]=NULL; x->x_nconnections--; - outlet_float(x->x_connectout, x->x_nconnections); } - /* disconnect a client by number */ static void tcpserver_disconnect_client(t_tcpserver *x, t_floatarg fclient) { @@ -511,7 +499,6 @@ static void tcpserver_disconnect_client(t_tcpserver *x, t_floatarg fclient) tcpserver_disconnect(x, client); } - /* disconnect a client by socket */ static void tcpserver_disconnect_socket(t_tcpserver *x, t_floatarg fsocket) { @@ -521,8 +508,6 @@ static void tcpserver_disconnect_socket(t_tcpserver *x, t_floatarg fsocket) } } - - /* disconnect a client by socket */ static void tcpserver_disconnect_all(t_tcpserver *x) { @@ -551,11 +536,9 @@ static void tcpserver_receive_callback(void *y0, } else { // disconnected int sockfd=y->sr_fd; - verbose(1, "[%s] got disconnection for socket:%d", objName, sockfd); + iemnet_log(x, IEMNET_VERBOSE, "got disconnection for socket:%d", sockfd); tcpserver_disconnect_socket(x, sockfd); } - - // post("tcpserver: %d bytes in %d packets", bytecount, packetcount); } static void tcpserver_connectpoll(t_tcpserver *x) @@ -571,12 +554,12 @@ static void tcpserver_connectpoll(t_tcpserver *x) } else { t_tcpserver_socketreceiver *y = NULL; if(x->x_nconnections>=MAX_CONNECT) { - pd_error(x, "%s: cannot handle more than %d connections, dropping", - objName, x->x_nconnections); + iemnet_log(x, IEMNET_ERROR, + "cannot handle more than %d connections, dropping!", + x->x_nconnections); iemnet__closesocket(fd); } - y = tcpserver_socketreceiver_new((void *)x, fd, &incomer_address); if (!y) { iemnet__closesocket(fd); @@ -616,7 +599,8 @@ static void tcpserver_port(t_tcpserver*x, t_floatarg fportno) sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd<0) { - sys_sockerror("[tcpserver]: cannot create TCP/IP socket"); + iemnet_log(x, IEMNET_ERROR, "unable to create TCP/IP socket"); + sys_sockerror("socket"); return; } @@ -629,7 +613,8 @@ static void tcpserver_port(t_tcpserver*x, t_floatarg fportno) server.sin_port = htons((u_short)portno); /* name the socket */ if (bind(sockfd, (struct sockaddr *)&server, serversize) < 0) { - sys_sockerror("tcpserver: bind"); + iemnet_log(x, IEMNET_ERROR, "unable to bind to TCP/IP socket"); + sys_sockerror("bind"); iemnet__closesocket(sockfd); outlet_anything(x->x_statout, gensym("port"), 1, ap); return; @@ -637,26 +622,25 @@ static void tcpserver_port(t_tcpserver*x, t_floatarg fportno) /* streaming protocol */ if (listen(sockfd, 5) < 0) { - sys_sockerror("tcpserver: listen"); + iemnet_log(x, IEMNET_ERROR, "unable to listen on TCP/IP socket"); + sys_sockerror("listen"); iemnet__closesocket(sockfd); sockfd = -1; outlet_anything(x->x_statout, gensym("port"), 1, ap); return; } else { - sys_addpollfn(sockfd, (t_fdpollfn)tcpserver_connectpoll, - x); // wait for new connections + /* wait for new connections */ + sys_addpollfn(sockfd, (t_fdpollfn)tcpserver_connectpoll, x); } x->x_connectsocket = sockfd; x->x_port = portno; - // find out which port is actually used (useful when assigning "0") if(!getsockname(sockfd, (struct sockaddr *)&server, &serversize)) { x->x_port=ntohs(server.sin_port); } - SETFLOAT(ap, x->x_port); outlet_anything(x->x_statout, gensym("port"), 1, ap); } @@ -693,8 +677,6 @@ static void *tcpserver_new(t_floatarg fportno) } x->x_defaulttarget=0; - - x->x_floatlist=iemnet__floatlist_create(1024); tcpserver_port(x, fportno); @@ -753,7 +735,6 @@ IEMNET_EXTERN void tcpserver_setup(void) gensym("targetsocket"), A_DEFFLOAT, 0); class_addlist (tcpserver_class, (t_method)tcpserver_defaultsend); - class_addmethod(tcpserver_class, (t_method)tcpserver_serialize, gensym("serialize"), A_FLOAT, 0); @@ -767,5 +748,4 @@ IEMNET_EXTERN void tcpserver_setup(void) IEMNET_INITIALIZER(tcpserver_setup); - /* end of tcpserver.c */ -- cgit v1.2.1