From 6b244ddd7e85c59f1c82fe410dfdefaef08134d7 Mon Sep 17 00:00:00 2001 From: Martin Peach Date: Wed, 24 Feb 2010 18:37:52 +0000 Subject: Corrected some error messages, check for EINVAL after recvfrom(), to try to find out why it happens... svn path=/trunk/externals/mrpeach/; revision=13189 --- net/udpreceive~.c | 37 +++++++++++++++++++++---------------- net/udpsend~.c | 2 +- net/udpsend~.h | 2 +- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/net/udpreceive~.c b/net/udpreceive~.c index 263ac05..f0f1759 100644 --- a/net/udpreceive~.c +++ b/net/udpreceive~.c @@ -200,8 +200,7 @@ static void udpreceive_tilde_datapoll(t_udpreceive_tilde *x) if (ret <= 0) /* error */ { - if (udpreceive_tilde_sockerror("recv tag")) - goto bail; + if (0 == udpreceive_tilde_sockerror("recv tag")) return; udpreceive_tilde_reset(x, 0); x->x_counter = 0; return; @@ -235,8 +234,16 @@ static void udpreceive_tilde_datapoll(t_udpreceive_tilde *x) } else if (ret < 0) /* error */ { - if (udpreceive_tilde_sockerror("recv data")) - goto bail; + if ( 0 == (ret = udpreceive_tilde_sockerror("recv data"))) return; +#ifdef _WIN32 + if ( ret == WSAEFAULT) +#else + if ( ret == EFAULT) +#endif + { + post ("udpreceive~: EFAULT: %p %lu %d", x->x_frames[x->x_framein].data, x->x_frames[x->x_framein].tag.framesize, n); + return; + } udpreceive_tilde_reset(x, 0); x->x_counter = 0; return; @@ -261,8 +268,6 @@ static void udpreceive_tilde_datapoll(t_udpreceive_tilde *x) } } } -bail: -; } static void udpreceive_tilde_connectpoll(t_udpreceive_tilde *x) @@ -309,7 +314,7 @@ static int udpreceive_tilde_createsocket(t_udpreceive_tilde* x, int portno) /* assign server port number */ server.sin_port = htons((u_short)portno); - post("listening to port number %d", portno); + post("udpreceive~: listening to port number %d", portno); udpreceive_tilde_setsocketoptions(sockfd); @@ -479,7 +484,7 @@ static void udpreceive_tilde_dsp(t_udpreceive_tilde *x, t_signal **sp) if (x->x_blocksize % sp[0]->s_n) { - error("netsend~: signal vector size too large (needs to be even divisor of %d)", x->x_blocksize); + error("udpreceive~: signal vector size too large (needs to be even divisor of %d)", x->x_blocksize); } else { @@ -709,11 +714,11 @@ static int udpreceive_tilde_sockerror(char *s) #ifdef _WIN32 int err = WSAGetLastError(); if (err == 10054) return 1; - else if (err == 10040) post("netsend~: %s: message too long (%d)", s, err); - else if (err == 10053) post("netsend~: %s: software caused connection abort (%d)", s, err); - else if (err == 10055) post("netsend~: %s: no buffer space available (%d)", s, err); - else if (err == 10060) post("netsend~: %s: connection timed out (%d)", s, err); - else if (err == 10061) post("netsend~: %s: connection refused (%d)", s, err); + else if (err == 10040) post("udpreceive~: %s: message too long (%d)", s, err); + else if (err == 10053) post("udpreceive~: %s: software caused connection abort (%d)", s, err); + else if (err == 10055) post("udpreceive~: %s: no buffer space available (%d)", s, err); + else if (err == 10060) post("udpreceive~: %s: connection timed out (%d)", s, err); + else if (err == 10061) post("udpreceive~: %s: connection refused (%d)", s, err); else post("udpreceive~: %s: %s (%d)", s, strerror(err), err); #else int err = errno; @@ -726,16 +731,16 @@ static int udpreceive_tilde_sockerror(char *s) if (err == EAGAIN) #endif { - return 1; /* recoverable error */ + return 0; /* recoverable error */ } - return 0; /* indicate non-recoverable error */ + return err; /* indicate non-recoverable error */ } static int udpreceive_tilde_setsocketoptions(int sockfd) { int sockopt = 1; if (setsockopt(sockfd, SOL_IP, TCP_NODELAY, (const char*)&sockopt, sizeof(int)) < 0) - post("setsockopt NODELAY failed"); + post("udpreceive~: setsockopt NODELAY failed"); sockopt = 1; if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&sockopt, sizeof(int)) < 0) diff --git a/net/udpsend~.c b/net/udpsend~.c index e951e5d..6d6d0f1 100644 --- a/net/udpsend~.c +++ b/net/udpsend~.c @@ -394,7 +394,7 @@ static t_int *udpsend_tilde_perform(t_int *w) int ret = send(x->x_fd, bp, length, SEND_FLAGS); if (ret <= 0) { - post ("length %ld", length); + post ("udpsend~: sending length %ld", length); udpsend_tilde_sockerror("send data"); pthread_mutex_unlock(&x->x_mutex); udpsend_tilde_disconnect(x); diff --git a/net/udpsend~.h b/net/udpsend~.h index 59dbbd7..6ecfa6d 100644 --- a/net/udpsend~.h +++ b/net/udpsend~.h @@ -34,7 +34,7 @@ /* Some enhancements have been made with the goal of keeping compatibility */ /* between the stream formats of streamout~/in~ and netsend~/receive~. */ -#define VERSION "0.3" +#define VERSION "0.31" #define DEFAULT_AUDIO_CHANNELS 32 /* nax. number of audio channels we support */ #define DEFAULT_AUDIO_BUFFER_SIZE 2048 /*1024*/ /* number of samples in one audio block */ -- cgit v1.2.1