diff --git a/src/remote/blockingUDPTransport.cpp b/src/remote/blockingUDPTransport.cpp index a2f9f9c..8296d56 100644 --- a/src/remote/blockingUDPTransport.cpp +++ b/src/remote/blockingUDPTransport.cpp @@ -51,6 +51,7 @@ inline int sendto(int s, const char *buf, size_t len, int flags, const struct so _sendAddresses(0), _ignoredAddresses(0), _sendToEnabled(false), + _localMulticastAddressEnabled(false), _receiveBuffer(new ByteBuffer(MAX_UDP_RECV)), _sendBuffer(new ByteBuffer(MAX_UDP_RECV)), _lastMessageStartPosition(0), diff --git a/src/server/serverContext.cpp b/src/server/serverContext.cpp index b3c4e77..44f4cff 100644 --- a/src/server/serverContext.cpp +++ b/src/server/serverContext.cpp @@ -284,22 +284,6 @@ void ServerContextImpl::initializeBroadcastTransport() listenLocalAddress.ia.sin_port = htons(_broadcastPort); listenLocalAddress.ia.sin_addr.s_addr = _ifaceAddr.ia.sin_addr.s_addr; - // where to send addresses - SOCKET socket = epicsSocketCreate(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (socket == INVALID_SOCKET) - { - THROW_BASE_EXCEPTION("Failed to initialize broadcast UDP transport"); - } - auto_ptr broadcastAddresses(getBroadcastAddresses(socket,_broadcastPort)); - - int ifIndex = discoverInterfaceIndex(socket, &listenLocalAddress); - if (ifIndex == -1) - { - LOG(logLevelWarn, "Unable to find interface index for %s.", inetAddressToString(listenLocalAddress, false).c_str()); - // TODO fallback - } - - epicsSocketDestroy(socket); TransportClient::shared_pointer nullTransportClient; @@ -309,15 +293,15 @@ void ServerContextImpl::initializeBroadcastTransport() listenLocalAddress, PVA_PROTOCOL_REVISION, PVA_DEFAULT_PRIORITY)); listenLocalAddress = *_broadcastTransport->getRemoteAddress(); - _broadcastTransport->setSendAddresses(broadcastAddresses.get()); _broadcastPort = ntohs(listenLocalAddress.ia.sin_port); + _ifaceBCast.ia.sin_port = listenLocalAddress.ia.sin_port; -#if !defined(_WIN32) if(_ifaceAddr.ia.sin_addr.s_addr != htonl(INADDR_ANY)) { if(_ifaceBCast.ia.sin_family == AF_UNSPEC || _ifaceBCast.ia.sin_addr.s_addr == listenLocalAddress.ia.sin_addr.s_addr) { LOG(logLevelWarn, "Unable to find broadcast address of interface %s.", inetAddressToString(_ifaceBCast, false).c_str()); } +#if !defined(_WIN32) else { /* An oddness of BSD sockets (not winsock) is that binding to @@ -326,8 +310,6 @@ void ServerContextImpl::initializeBroadcastTransport() * is to bind a second socket to the interface broadcast address, * which will then receive only broadcasts. */ - _ifaceBCast.ia.sin_port = listenLocalAddress.ia.sin_port; - _broadcastTransport2 = static_pointer_cast(broadcastConnector->connect( nullTransportClient, _responseHandler, _ifaceBCast, PVA_PROTOCOL_REVISION, @@ -340,17 +322,41 @@ void ServerContextImpl::initializeBroadcastTransport() } #endif - // set ignore address list - if (!_ignoreAddressList.empty()) - { - // we do not care about the port - auto_ptr list(getSocketAddressList(_ignoreAddressList, 0, NULL)); - if (list.get() != NULL && list->size() > 0) - { - _broadcastTransport->setIgnoredAddresses(list.get()); - } - } - // set broadcast address list + + SOCKET socket = epicsSocketCreate(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (socket == INVALID_SOCKET) + { + THROW_BASE_EXCEPTION("Failed to initialize broadcast UDP transport"); + } + + + auto_ptr broadcastAddresses; + if(_ifaceAddr.ia.sin_addr.s_addr != htonl(INADDR_ANY)) + { + InetAddrVector * v = new InetAddrVector; + v->push_back(_ifaceBCast); + broadcastAddresses.reset(v); + } + else + { + // all the interfaces + broadcastAddresses.reset(getBroadcastAddresses(socket, _broadcastPort)); + } + + int ifIndex = discoverInterfaceIndex(socket, &listenLocalAddress); + if (ifIndex == -1) + { + LOG(logLevelWarn, "Unable to find interface index for %s.", inetAddressToString(listenLocalAddress, false).c_str()); + // TODO fallback + } + + epicsSocketDestroy(socket); + + + // set default (auto) address list + _broadcastTransport->setSendAddresses(broadcastAddresses.get()); + + // set broadcast address list if (!_beaconAddressList.empty()) { // if auto is true, add it to specified list @@ -368,6 +374,29 @@ void ServerContextImpl::initializeBroadcastTransport() } + // debug output for broadcast addresses + InetAddrVector* blist = _broadcastTransport->getSendAddresses(); + if (!blist || !blist->size()) + LOG(logLevelWarn, + "No broadcast addresses found or specified!"); + else + for (size_t i = 0; i < blist->size(); i++) + LOG(logLevelDebug, + "Broadcast address #%d: %s.", i, inetAddressToString((*blist)[i]).c_str()); + + // + // set ignore address list + // + if (!_ignoreAddressList.empty()) + { + // we do not care about the port + auto_ptr list(getSocketAddressList(_ignoreAddressList, 0, NULL)); + if (list.get() != NULL && list->size() > 0) + { + _broadcastTransport->setIgnoredAddresses(list.get()); + } + } + // // Setup local broadcasting //