Files
epics-base/modules/libcom/src/osi/os/default/osdSockAddrReuse.cpp
T
Michael Davidsaver e34b6c5c0c Fix spelling in comments
Should be non-functional, except for some error message strings.
2021-08-29 07:27:50 -07:00

69 lines
2.0 KiB
C++

/*************************************************************************\
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* SPDX-License-Identifier: EPICS
* EPICS Base is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
* Author: Jeff Hill
*/
#if defined(__rtems__)
# define __BSD_VISIBLE 1
#endif
#include "osiSock.h"
#include "errlog.h"
LIBCOM_API void epicsStdCall
epicsSocketEnableAddressReuseDuringTimeWaitState ( SOCKET s )
{
#ifdef _WIN32
/*
* Note: WINSOCK appears to assign a different functionality for
* SO_REUSEADDR compared to other OS. With WINSOCK SO_REUSEADDR indicates
* that simultaneously 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 ( even if SO_REUSEADDR isn't set ).
*/
#else
int yes = true;
int status;
status = setsockopt ( s, SOL_SOCKET, SO_REUSEADDR,
(char *) & yes, sizeof ( yes ) );
if ( status < 0 ) {
errlogPrintf (
"epicsSocketEnableAddressReuseDuringTimeWaitState: "
"unable to set SO_REUSEADDR?\n");
}
#endif
}
static
void setfanout(SOCKET s, int opt, const char *optname)
{
int yes = true;
int status;
status = setsockopt ( s, SOL_SOCKET, opt,
(char *) & yes, sizeof ( yes ) );
if ( status < 0 ) {
errlogPrintf (
"epicsSocketEnablePortUseForDatagramFanout: "
"unable to set %s?\n", optname);
}
}
void epicsStdCall epicsSocketEnableAddressUseForDatagramFanout ( SOCKET s )
{
#define DOIT(sock, opt) setfanout(sock, opt, #opt)
#ifdef SO_REUSEPORT
DOIT(s, SO_REUSEPORT);
#endif
DOIT(s, SO_REUSEADDR);
#undef DOIT
}