diff --git a/src/libCom/osi/os/WIN32/osdSock.h b/src/libCom/osi/os/WIN32/osdSock.h index 3f7c8b8af..565a5608c 100644 --- a/src/libCom/osi/os/WIN32/osdSock.h +++ b/src/libCom/osi/os/WIN32/osdSock.h @@ -57,4 +57,13 @@ typedef int osiSocklen_t; */ #define FD_IN_FDSET(FD) (1) -epicsShareFunc unsigned epicsShareAPI wsaMajorVersion (); \ No newline at end of file +epicsShareFunc unsigned epicsShareAPI wsaMajorVersion (); + +/* + * Note: WINSOCK appears to assign a different functionality for + * SO_REUSEADDR compared to other OS. With WINSOCK SO_REUSEADDR indicates + * that other servers can bind to the same TCP port on the same host! + * Also, servers are always enabled to reuse a port immediately after + * they exit. + */ +#define SO_REUSEADDR_DOES_NOT_RELEASE_TCP_PORT diff --git a/src/rsrv/caservertask.c b/src/rsrv/caservertask.c index 5770ab36c..072b4480b 100644 --- a/src/rsrv/caservertask.c +++ b/src/rsrv/caservertask.c @@ -312,15 +312,17 @@ LOCAL int req_server (void) threadSuspendSelf (); } - flag = 1; - status = setsockopt ( IOC_sock, SOL_SOCKET, SO_REUSEADDR, - (char *) &flag, sizeof (flag) ); - if ( status < 0 ) { - int errnoCpy = SOCKERRNO; - errlogPrintf ( - "%s: set socket option SO_REUSEADDR failed because \"%s\"\n", - __FILE__, SOCKERRSTR (errnoCpy) ); - } +# ifndef SO_REUSEADDR_DOES_NOT_RELEASE_TCP_PORT + flag = 1; + status = setsockopt ( IOC_sock, SOL_SOCKET, SO_REUSEADDR, + (char *) &flag, sizeof (flag) ); + if ( status < 0 ) { + int errnoCpy = SOCKERRNO; + errlogPrintf ( + "%s: set socket option SO_REUSEADDR failed because \"%s\"\n", + __FILE__, SOCKERRSTR (errnoCpy) ); + } +# endif /* listen and accept new connections */ if ( listen ( IOC_sock, 10 ) < 0 ) { diff --git a/src/util/iocLogServer.c b/src/util/iocLogServer.c index b94dc141d..f576c8921 100644 --- a/src/util/iocLogServer.c +++ b/src/util/iocLogServer.c @@ -47,6 +47,9 @@ * .09 050494 pg HPUX port changes. * .10 021694 joh ANSI C * $Log$ + * Revision 1.38 2000/08/25 19:44:30 jhill + * fixed Linux uses unsigned where int is used on other OS + * * Revision 1.37 2000/02/10 17:47:13 jhill * dont include osiSockResource.h * @@ -240,16 +243,18 @@ int main() return IOCLS_ERROR; } - optval = TRUE; - status = setsockopt( pserver->sock, - SOL_SOCKET, - SO_REUSEADDR, - (char *) &optval, - sizeof(optval)); - if(status<0){ - fprintf(stderr, "iocLogServer: setsockopt err %s\n", SOCKERRSTR(SOCKERRNO)); - return IOCLS_ERROR; - } +# ifndef SO_REUSEADDR_DOES_NOT_RELEASE_TCP_PORT + optval = TRUE; + status = setsockopt( pserver->sock, + SOL_SOCKET, + SO_REUSEADDR, + (char *) &optval, + sizeof(optval)); + if(status<0){ + fprintf(stderr, "iocLogServer: setsockopt err %s\n", SOCKERRSTR(SOCKERRNO)); + return IOCLS_ERROR; + } +# endif /* Zero the sock_addr structure */ memset((void *)&serverAddr, 0, sizeof serverAddr);