moved listen into rsrv_grab_tcp to allow retry if failed

Fixes race condition with multiple IOCs starting simultaneously.
This commit is contained in:
Bryan Robert Tester
2020-02-12 15:11:38 +00:00
committed by Michael Davidsaver
parent 983937a52f
commit 4844fbbd82

View File

@@ -66,17 +66,6 @@ static void req_server (void *pParm)
IOC_sock = conf->tcp;
/* listen and accept new connections */
if ( listen ( IOC_sock, 20 ) < 0 ) {
char sockErrBuf[64];
epicsSocketConvertErrnoToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "CAS: Listen error: %s\n",
sockErrBuf );
epicsSocketDestroy (IOC_sock);
epicsThreadSuspendSelf ();
}
epicsEventSignal(castcp_startStopEvent);
while (TRUE) {
@@ -194,7 +183,7 @@ SOCKET* rsrv_grab_tcp(unsigned short *port)
epicsSocketEnableAddressReuseDuringTimeWaitState ( tcpsock );
if(bind(tcpsock, &scratch.sa, sizeof(scratch))==0) {
if(bind(tcpsock, &scratch.sa, sizeof(scratch))==0 && listen(tcpsock, 20)==0) {
if(scratch.ia.sin_port==0) {
/* use first socket to pick a random port */
osiSocklen_t alen = sizeof(ifaceAddr);