18 # include <winsock2.h>
19 # include <ws2tcpip.h>
21 # include <sys/socket.h>
22 # include <netinet/in.h>
24 # define closesocket close
28 #include "epicsStdlib.h"
29 #include "epicsString.h"
31 #include "epicsMutex.h"
33 #include "dbStaticLib.h"
34 #include "dbFldTypes.h"
36 #include "dbAccessDefs.h"
37 #include <epicsTypes.h>
38 #include <epicsTime.h>
39 #include <epicsThread.h>
40 #include <epicsString.h>
41 #include <epicsTimer.h>
42 #include <epicsMutex.h>
49 #include <registryFunction.h>
51 #include <epicsExport.h>
57 struct sockaddr_in serv_addr;
68 sock = socket(AF_INET, SOCK_STREAM, 0);
70 errlogPrintf(
"freeIPPort: socket error\n");
74 if (setsockopt(sock, SOL_SOCKET, SO_EXCLUSIVEADDRUSE , (
char*)&enable,
sizeof(enable)) < 0 ) {
75 errlogPrintf(
"freeIPPort: setsockopt error\n");
79 if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)&enable,
sizeof(enable)) < 0) {
80 errlogPrintf(
"freeIPPort: setsockopt error\n");
84 memset((
char *) &serv_addr, 0,
sizeof(serv_addr));
85 serv_addr.sin_family = AF_INET;
86 serv_addr.sin_addr.s_addr = INADDR_ANY;
87 serv_addr.sin_port = 0;
88 if (bind(sock, (
struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0) {
89 errlogPrintf(
"freeIPPort: bind error\n");
92 len =
sizeof(serv_addr);
93 if (getsockname(sock, (
struct sockaddr *)&serv_addr, &len) == -1) {
94 errlogPrintf(
"freeIPPort: getsockname error\n");
98 port = ntohs(serv_addr.sin_port);
105 std::stringstream oss;
109 epicsEnvSet(macro, oss.str().c_str());
113 errlogPrintf(
"freeIPPort: please specify a macro to set\n");
static void freeIPPortRegister(void)
static const iocshArg *const freeIPPortArgs[]
epicsShareFunc int freeIPPort(const char *macro)
static int getFreeIPPort()
static void freeIPPortCallFunc(const iocshArgBuf *args)
static const iocshArg freeIPPortArg0
macro to set
static const iocshFuncDef freeIPPortFuncDef
epicsExportRegistrar(dbLoadRecordsFuncsRegister)