This is Unofficial EPICS BASE Doxygen Site
epics::pvAccess::BlockingUDPConnector Class Reference

#include "blockingUDP.h"

Public Member Functions

 POINTER_DEFINITIONS (BlockingUDPConnector)
 
 BlockingUDPConnector (bool serverFlag)
 
BlockingUDPTransport::shared_pointer connect (ResponseHandler::shared_pointer const &responseHandler, osiSockAddr &bindAddress, epics::pvData::int8 transportRevision)
 

Detailed Description

Definition at line 379 of file blockingUDP.h.

Constructor & Destructor Documentation

epics::pvAccess::BlockingUDPConnector::BlockingUDPConnector ( bool  serverFlag)
inline

Definition at line 383 of file blockingUDP.h.

383 :_serverFlag(serverFlag) {}

Member Function Documentation

BlockingUDPTransport::shared_pointer epics::pvAccess::BlockingUDPConnector::connect ( ResponseHandler::shared_pointer const &  responseHandler,
osiSockAddr bindAddress,
epics::pvData::int8  transportRevision 
)

NOTE: transport client is ignored for broadcast (UDP).

Definition at line 38 of file blockingUDPConnector.cpp.

41 {
42  SOCKET socket = epicsSocketCreate(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
43  if(socket==INVALID_SOCKET) {
44  char errStr[64];
45  epicsSocketConvertErrnoToString(errStr, sizeof(errStr));
46  LOG(logLevelError, "Error creating socket: %s.", errStr);
47  return BlockingUDPTransport::shared_pointer();
48  }
49 
50  int optval = 1;
51  int retval = ::setsockopt(socket, SOL_SOCKET, SO_BROADCAST, (char *)&optval, sizeof(optval));
52  if(retval<0)
53  {
54  char errStr[64];
55  epicsSocketConvertErrnoToString(errStr, sizeof(errStr));
56  LOG(logLevelError, "Error setting SO_BROADCAST: %s.", errStr);
57  epicsSocketDestroy (socket);
58  return BlockingUDPTransport::shared_pointer();
59  }
60 
61  /*
62  IPv4 multicast addresses are defined by the leading address bits of 1110,
63  originating from the classful network design of the early Internet when this
64  group of addresses was designated as Class D. The Classless Inter-Domain Routing (CIDR)
65  prefix of this group is 224.0.0.0/4.
66  The group includes the addresses from 224.0.0.0 to 239.255.255.255.
67  Address assignments from within this range are specified in RFC 5771,
68  an Internet Engineering Task Force (IETF) Best Current Practice document (BCP 51).*/
69 
70 
71  // set SO_REUSEADDR or SO_REUSEPORT, OS dependant
73 
74  retval = ::bind(socket, (sockaddr*)&(bindAddress.sa), sizeof(sockaddr));
75  if(retval<0) {
76  char ip[24];
77  sockAddrToDottedIP((sockaddr*)&(bindAddress.sa), ip, sizeof(ip));
78  char errStr[64];
79  epicsSocketConvertErrnoToString(errStr, sizeof(errStr));
80  LOG(logLevelError, "Error binding socket %s: %s.", ip, errStr);
81  epicsSocketDestroy (socket);
82  return BlockingUDPTransport::shared_pointer();
83  }
84 
85  // sockets are blocking by default
86  BlockingUDPTransport::shared_pointer transport(new BlockingUDPTransport(_serverFlag, responseHandler,
87  socket, bindAddress, transportRevision));
88  transport->internal_this = transport;
89 
90  // the worker thread holds a strong ref, which is released by transport->close()
91  BlockingUDPTransport::shared_pointer ret(transport.get(), closer(transport));
92 
93  return ret;
94 }
LIBCOM_API void epicsStdCall epicsSocketDestroy(SOCKET s)
Definition: osdSock.c:117
unsigned epicsStdCall sockAddrToDottedIP(const struct sockaddr *paddr, char *pBuf, unsigned bufSize)
Definition: osiSock.c:118
#define INVALID_SOCKET
Definition: osdSock.h:32
struct sockaddr sa
Definition: osiSock.h:158
void epicsStdCall epicsSocketEnableAddressUseForDatagramFanout(SOCKET s)
void epicsSocketConvertErrnoToString(char *pBuf, unsigned bufSize)
LIBCOM_API SOCKET epicsStdCall epicsSocketCreate(int domain, int type, int protocol)
Definition: osdSock.c:71
#define LOG(level, format,...)
Definition: logger.h:48
int SOCKET
Definition: osdSock.h:31
epics::pvAccess::BlockingUDPConnector::POINTER_DEFINITIONS ( BlockingUDPConnector  )

The documentation for this class was generated from the following files: