diff --git a/src/remote/blockingUDPTransport.cpp b/src/remote/blockingUDPTransport.cpp index 5da1686..2feb02d 100644 --- a/src/remote/blockingUDPTransport.cpp +++ b/src/remote/blockingUDPTransport.cpp @@ -578,6 +578,95 @@ void initializeUDPTransports(bool serverFlag, TransportClient::shared_pointer nullTransportClient; auto_ptr connector(new BlockingUDPConnector(serverFlag, true, true)); + // + // Create UDP transport for sending (to all network interfaces) + // + + osiSockAddr anyAddress; + anyAddress.ia.sin_family = AF_INET; + anyAddress.ia.sin_port = htons(0); + anyAddress.ia.sin_addr.s_addr = htonl(INADDR_ANY); + + sendTransport = static_pointer_cast(connector->connect( + nullTransportClient, responseHandler, + anyAddress, PVA_PROTOCOL_REVISION, + PVA_DEFAULT_PRIORITY)); + if (!sendTransport) + { + THROW_BASE_EXCEPTION("Failed to initialize UDP transport."); + } + + // to allow automatic assignment of listen port (for testing) + if (listenPort == 0) + { + listenPort = ntohs(sendTransport->getRemoteAddress()->ia.sin_port); + LOG(logLevelDebug, "Dynamic listen UDP port set to %d.", listenPort); + } + + // TODO current implementation shares the port (aka beacon and search port) + int32 sendPort = listenPort; + + // + // compile auto address list - where to send packets + // + + InetAddrVector autoBCastAddr; + for (IfaceNodeVector::const_iterator iter = ifaceList.begin(); iter != ifaceList.end(); iter++) + { + ifaceNode node = *iter; + + if (node.ifaceBCast.ia.sin_family != AF_UNSPEC) + { + node.ifaceBCast.ia.sin_port = htons(sendPort); + autoBCastAddr.push_back(node.ifaceBCast); + } + } + + // + // set send address list + // + + if (!addressList.empty()) + { + // if auto is true, add it to specified list + if (!autoAddressList) + autoBCastAddr.clear(); + + auto_ptr list(getSocketAddressList(addressList, sendPort, &autoBCastAddr)); + if (list.get() && list->size()) + { + sendTransport->setSendAddresses(list.get()); + } + /* + else + { + // fallback + // set default (auto) address list + sendTransport->setSendAddresses(&autoBCastAddr); + } + */ + } + else if (autoAddressList) + { + // set default (auto) address list + sendTransport->setSendAddresses(&autoBCastAddr); + } + + + sendTransport->start(); + udpTransports.push_back(sendTransport); + + // debug output of broadcast addresses + InetAddrVector* blist = sendTransport->getSendAddresses(); + if (!blist || !blist->size()) + LOG(logLevelError, + "No broadcast addresses found or specified - empty address list!"); + else + for (size_t i = 0; i < blist->size(); i++) + LOG(logLevelDebug, + "Broadcast address #%d: %s.", i, inetAddressToString((*blist)[i]).c_str()); + + // TODO configurable local NIF, address osiSockAddr loAddr; getLoopbackNIF(loAddr, "", 0); @@ -623,14 +712,6 @@ void initializeUDPTransports(bool serverFlag, if (!transport) continue; listenLocalAddress = *transport->getRemoteAddress(); - // to allow automatic assignment of listen port (for testing) - if (listenPort == 0) - { - listenPort = ntohs(listenLocalAddress.ia.sin_port); - aToIPAddr(mcastAddress.c_str(), listenPort, &group.ia); - - LOG(logLevelDebug, "Dynamic listen UDP port set to %d.", listenPort); - } if (ignoreAddressVector.get() && ignoreAddressVector->size()) transport->setIgnoredAddresses(ignoreAddressVector.get()); @@ -703,87 +784,6 @@ void initializeUDPTransports(bool serverFlag, } - // - // Create UDP transport for sending (to all network interfaces) - // - - osiSockAddr anyAddress; - anyAddress.ia.sin_family = AF_INET; - anyAddress.ia.sin_port = htons(0); - anyAddress.ia.sin_addr.s_addr = htonl(INADDR_ANY); - - sendTransport = static_pointer_cast(connector->connect( - nullTransportClient, responseHandler, - anyAddress, PVA_PROTOCOL_REVISION, - PVA_DEFAULT_PRIORITY)); - if (!sendTransport) - { - THROW_BASE_EXCEPTION("Failed to initialize UDP transport."); - } - - // TODO current implementation shares the port (aka beacon and search port) - int32 sendPort = listenPort; - - // - // compile auto address list - where to send packets - // - - InetAddrVector autoBCastAddr; - for (IfaceNodeVector::const_iterator iter = ifaceList.begin(); iter != ifaceList.end(); iter++) - { - ifaceNode node = *iter; - - if (node.ifaceBCast.ia.sin_family != AF_UNSPEC) - { - node.ifaceBCast.ia.sin_port = htons(sendPort); - autoBCastAddr.push_back(node.ifaceBCast); - } - } - - // - // set send address list - // - - if (!addressList.empty()) - { - // if auto is true, add it to specified list - if (!autoAddressList) - autoBCastAddr.clear(); - - auto_ptr list(getSocketAddressList(addressList, sendPort, &autoBCastAddr)); - if (list.get() && list->size()) - { - sendTransport->setSendAddresses(list.get()); - } - /* - else - { - // fallback - // set default (auto) address list - sendTransport->setSendAddresses(&autoBCastAddr); - } - */ - } - else if (autoAddressList) - { - // set default (auto) address list - sendTransport->setSendAddresses(&autoBCastAddr); - } - - - sendTransport->start(); - udpTransports.push_back(sendTransport); - - // debug output of broadcast addresses - InetAddrVector* blist = sendTransport->getSendAddresses(); - if (!blist || !blist->size()) - LOG(logLevelError, - "No broadcast addresses found or specified - empty address list!"); - else - for (size_t i = 0; i < blist->size(); i++) - LOG(logLevelDebug, - "Broadcast address #%d: %s.", i, inetAddressToString((*blist)[i]).c_str()); - // // Setup local multicasting // diff --git a/src/server/responseHandlers.cpp b/src/server/responseHandlers.cpp index 89bd580..f2c1258 100644 --- a/src/server/responseHandlers.cpp +++ b/src/server/responseHandlers.cpp @@ -406,10 +406,14 @@ void ServerChannelFindRequesterImpl::channelFindResult(const Status& /*status*/, { ServerSearchHandler::s_channelNameToProvider[_name] = channelFind->getChannelProvider(); } - _wasFound = wasFound; - TransportSender::shared_pointer thisSender = shared_from_this(); - _context->getBroadcastTransport()->enqueueSendRequest(thisSender); + + BlockingUDPTransport::shared_pointer bt = _context->getBroadcastTransport(); + if (bt) + { + TransportSender::shared_pointer thisSender = shared_from_this(); + bt->enqueueSendRequest(thisSender); + } } }