From c5e0079ae1323ad4c35d28f83ce732bb3820c46a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Mon, 31 Aug 2015 22:11:51 +0000 Subject: un-threaded receive svn path=/trunk/externals/iem/iemnet/; revision=17543 --- udpsend.c | 87 ++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 42 insertions(+), 45 deletions(-) (limited to 'udpsend.c') diff --git a/udpsend.c b/udpsend.c index 7def6cf..620f7c0 100644 --- a/udpsend.c +++ b/udpsend.c @@ -1,5 +1,5 @@ /* udpsend.c - * copyright (c) 2010 IOhannes m zmölnig, IEM + * copyright (c) 2010 IOhannes m zmölnig, IEM * copyright (c) 2006-2010 Martin Peach * copyright (c) Miller Puckette */ @@ -18,9 +18,8 @@ /* GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ -/* along with this program; if not, write to the Free Software */ -/* Foundation, Inc., */ -/* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +/* along with this program; if not, see */ +/* http://www.gnu.org/licenses/ */ /* */ #define DEBUGLEVEL 1 @@ -32,44 +31,42 @@ static const char objName[] = "udpsend"; static t_class *udpsend_class; -typedef struct _udpsend -{ +typedef struct _udpsend { t_object x_obj; t_iemnet_sender*x_sender; } t_udpsend; static void udpsend_connect(t_udpsend *x, t_symbol *hostname, - t_floatarg fportno) + t_floatarg fportno) { struct sockaddr_in server; int sockfd; int portno = fportno; int broadcast = 1;/* nonzero is true */ + memset(&server, 0, sizeof(server)); - if (x->x_sender) - { - error("[%s] already connected", objName); - return; - } + if (x->x_sender) { + error("[%s] already connected", objName); + return; + } /* create a socket */ sockfd = socket(AF_INET, SOCK_DGRAM, 0); DEBUG("send socket %d\n", sockfd); - if (sockfd < 0) - { - sys_sockerror("[udpsend] socket"); - return; - } + if (sockfd < 0) { + sys_sockerror("[udpsend] socket"); + return; + } /* Based on zmoelnig's patch 2221504: Enable sending of broadcast messages (if hostname is a broadcast address)*/ #ifdef SO_BROADCAST - if( 0 != setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (const void *)&broadcast, sizeof(broadcast))) - { - error("[%s] couldn't switch to broadcast mode", objName); - } + if( 0 != setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, + (const void *)&broadcast, sizeof(broadcast))) { + error("[%s] couldn't switch to broadcast mode", objName); + } #endif /* SO_BROADCAST */ - + /* connect socket using hostname provided in command line */ server.sin_family = AF_INET; @@ -82,20 +79,19 @@ static void udpsend_connect(t_udpsend *x, t_symbol *hostname, } else { struct addrinfo * res; for (res = addr; res != NULL; res = res->ai_next) { - struct sockaddr_in *sa = (struct sockaddr_in *) res->ai_addr; - int len = res->ai_addrlen; - // memcpy((char *)&server.sin_addr, (char *)res->ai_addr, hp->h_length); - // LATER check how to do that... + struct sockaddr_in *sa = (struct sockaddr_in *) res->ai_addr; + int len = res->ai_addrlen; + // memcpy((char *)&server.sin_addr, (char *)res->ai_addr, hp->h_length); + // LATER check how to do that... } } freeaddrinfo(addr); #else struct hostent *hp = gethostbyname(hostname->s_name); - if (hp == 0) - { - error("[%s] bad host '%s'?", objName, hostname->s_name); - return; - } + if (hp == 0) { + error("[%s] bad host '%s'?", objName, hostname->s_name); + return; + } memcpy((char *)&server.sin_addr, (char *)hp->h_addr, hp->h_length); #endif } while(0); @@ -105,20 +101,19 @@ static void udpsend_connect(t_udpsend *x, t_symbol *hostname, DEBUG("connecting to port %d", portno); /* try to connect. */ - if (connect(sockfd, (struct sockaddr *) &server, sizeof (server)) < 0) - { - sys_sockerror("[udpsend] connecting stream socket"); - sys_closesocket(sockfd); - return; - } - x->x_sender=iemnet__sender_create(sockfd); + if (connect(sockfd, (struct sockaddr *) &server, sizeof (server)) < 0) { + sys_sockerror("[udpsend] connecting stream socket"); + iemnet__closesocket(sockfd); + return; + } + x->x_sender=iemnet__sender_create(sockfd, NULL, NULL, 0); outlet_float(x->x_obj.ob_outlet, 1); } static void udpsend_disconnect(t_udpsend *x) { if(x->x_sender) { - iemnet__sender_destroy(x->x_sender); + iemnet__sender_destroy(x->x_sender, 0); x->x_sender=NULL; outlet_float(x->x_obj.ob_outlet, 0); } @@ -150,18 +145,20 @@ static void *udpsend_new(void) IEMNET_EXTERN void udpsend_setup(void) { - if(!iemnet__register(objName))return; + if(!iemnet__register(objName)) { + return; + } udpsend_class = class_new(gensym(objName), (t_newmethod)udpsend_new, - (t_method)udpsend_free, - sizeof(t_udpsend), 0, 0); + (t_method)udpsend_free, + sizeof(t_udpsend), 0, 0); class_addmethod(udpsend_class, (t_method)udpsend_connect, - gensym("connect"), A_SYMBOL, A_FLOAT, 0); + gensym("connect"), A_SYMBOL, A_FLOAT, 0); class_addmethod(udpsend_class, (t_method)udpsend_disconnect, - gensym("disconnect"), 0); + gensym("disconnect"), 0); class_addmethod(udpsend_class, (t_method)udpsend_send, gensym("send"), - A_GIMME, 0); + A_GIMME, 0); class_addlist(udpsend_class, (t_method)udpsend_send); DEBUGMETHOD(udpsend_class); } -- cgit v1.2.1