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 --- udpsend.c | 77 ++++++++++++++++++++++++++++----------------------------------- 1 file changed, 34 insertions(+), 43 deletions(-) (limited to 'udpsend.c') diff --git a/udpsend.c b/udpsend.c index 620f7c0..3451a41 100644 --- a/udpsend.c +++ b/udpsend.c @@ -1,5 +1,5 @@ /* udpsend.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) Miller Puckette */ @@ -34,79 +34,67 @@ static t_class *udpsend_class; typedef struct _udpsend { t_object x_obj; t_iemnet_sender*x_sender; + int x_fd; } t_udpsend; static void udpsend_connect(t_udpsend *x, t_symbol *hostname, t_floatarg fportno) { struct sockaddr_in server; + struct hostent *hp = NULL; 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); + iemnet_log(x, IEMNET_ERROR, "already connected"); return; } + /* connect socket using hostname provided in command line */ + server.sin_family = AF_INET; + + hp = gethostbyname(hostname->s_name); + if (hp == 0) { + iemnet_log(x, IEMNET_ERROR, "bad host '%s'?", hostname->s_name); + return; + } + memcpy((char *)&server.sin_addr, (char *)hp->h_addr, hp->h_length); + + /* assign client port number */ + server.sin_port = htons((u_short)portno); + + DEBUG("connecting to port %d", portno); + + /* create a socket */ sockfd = socket(AF_INET, SOCK_DGRAM, 0); DEBUG("send socket %d\n", sockfd); if (sockfd < 0) { - sys_sockerror("[udpsend] socket"); + iemnet_log(x, IEMNET_ERROR, "unable to create datagram socket"); + sys_sockerror("socket"); return; } - /* Based on zmoelnig's patch 2221504: - Enable sending of broadcast messages (if hostname is a broadcast address)*/ + /* 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); + iemnet_log(x, IEMNET_ERROR, "unable to switch to broadcast mode"); + sys_sockerror("setsockopt:SO_BROADCAST"); } #endif /* SO_BROADCAST */ - /* connect socket using hostname provided in command line */ - server.sin_family = AF_INET; - - do { -#if 0 - struct addrinfo * addr=NULL; - if(getaddrinfo(hostname->s_name, NULL, NULL, &addr)) { - error("[%s] bad host '%s'?", objName, hostname->s_name); - return; - } 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... - } - } - freeaddrinfo(addr); -#else - struct hostent *hp = gethostbyname(hostname->s_name); - 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); - - /* assign client port number */ - server.sin_port = htons((u_short)portno); - - DEBUG("connecting to port %d", portno); /* try to connect. */ if (connect(sockfd, (struct sockaddr *) &server, sizeof (server)) < 0) { - sys_sockerror("[udpsend] connecting stream socket"); + iemnet_log(x, IEMNET_ERROR, "unable to connect to socket:%d", sockfd); + sys_sockerror("connect"); iemnet__closesocket(sockfd); return; } x->x_sender=iemnet__sender_create(sockfd, NULL, NULL, 0); + x->x_fd = sockfd; outlet_float(x->x_obj.ob_outlet, 1); } @@ -114,7 +102,11 @@ static void udpsend_disconnect(t_udpsend *x) { if(x->x_sender) { iemnet__sender_destroy(x->x_sender, 0); - x->x_sender=NULL; + } + x->x_sender=NULL; + if(x->x_fd >= 0) { + iemnet__closesocket(x->x_fd); + x->x_fd=-1; outlet_float(x->x_obj.ob_outlet, 0); } } @@ -126,7 +118,7 @@ static void udpsend_send(t_udpsend *x, t_symbol *s, int argc, t_atom *argv) iemnet__sender_send(x->x_sender, chunk); iemnet__chunk_destroy(chunk); } else { - error("[%s]: not connected", objName); + iemnet_log(x, IEMNET_ERROR, "not connected"); } } @@ -166,4 +158,3 @@ IEMNET_EXTERN void udpsend_setup(void) IEMNET_INITIALIZER(udpsend_setup); /* end udpsend.c*/ - -- cgit v1.2.1