From 9281f1126471fa90e2d6fe094c4c6eba00073ea6 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 20 Feb 2010 14:23:25 +0000 Subject: 2010-02-20 Tatsuhiro Tsujikawa Added Local Peer Discovery. It is disabled by default. Use --bt-enable-lpd to enable the function. * src/BtConstants.h * src/BtSetup.cc * src/LpdDispatchMessageCommand.cc * src/LpdDispatchMessageCommand.h * src/LpdMessage.h * src/LpdMessageDispatcher.cc * src/LpdMessageDispatcher.h * src/LpdMessageReceiver.cc * src/LpdMessageReceiver.h * src/LpdReceiveMessageCommand.cc * src/LpdReceiveMessageCommand.h * src/Makefile.am * src/OptionHandlerFactory.cc * src/Peer.cc * src/Peer.h * src/PeerInteractionCommand.cc * src/SocketCore.cc * src/SocketCore.h * src/prefs.cc * src/prefs.h * src/usage_text.h * src/util.cc * src/util.h * test/LpdMessageDispatcherTest.cc * test/LpdMessageReceiverTest.cc * test/Makefile.am --- src/BtSetup.cc | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'src/BtSetup.cc') diff --git a/src/BtSetup.cc b/src/BtSetup.cc index df59fbcf..756f745c 100644 --- a/src/BtSetup.cc +++ b/src/BtSetup.cc @@ -60,6 +60,12 @@ #include "BtRuntime.h" #include "bittorrent_helper.h" #include "BtStopDownloadCommand.h" +#include "LpdReceiveMessageCommand.h" +#include "LpdDispatchMessageCommand.h" +#include "LpdMessageReceiver.h" +#include "LpdMessageDispatcher.h" +#include "message.h" +#include "SocketCore.h" namespace aria2 { @@ -164,6 +170,39 @@ void BtSetup::setup(std::deque& commands, PeerListenCommand* listenCommand = PeerListenCommand::getInstance(e); btRuntime->setListenPort(listenCommand->getPort()); } + if(option->getAsBool(PREF_BT_ENABLE_LPD) && + (metadataGetMode || torrentAttrs[bittorrent::PRIVATE].i() == 0)) { + if(LpdReceiveMessageCommand::getNumInstance() == 0) { + SharedHandle receiver + (new LpdMessageReceiver(LPD_MULTICAST_ADDR, LPD_MULTICAST_PORT)); + try { + receiver->init(); + receiver->getSocket()->setMulticastTtl(1); + } catch(RecoverableException& e) { + _logger->info(EX_EXCEPTION_CAUGHT, e); + receiver.reset(); + } + if(!receiver.isNull()) { + LpdReceiveMessageCommand* cmd = + LpdReceiveMessageCommand::getInstance(e, receiver); + e->commands.push_back(cmd); + } + } + if(LpdReceiveMessageCommand::getNumInstance()) { + const unsigned char* infoHash = + bittorrent::getInfoHash(requestGroup->getDownloadContext()); + SharedHandle dispatcher + (new LpdMessageDispatcher + (std::string(&infoHash[0], &infoHash[INFO_HASH_LENGTH]), + btRuntime->getListenPort(), + LPD_MULTICAST_ADDR, LPD_MULTICAST_PORT, + LpdReceiveMessageCommand::getInstance()->getReceiverSocket())); + LpdDispatchMessageCommand* cmd = + new LpdDispatchMessageCommand(e->newCUID(), dispatcher, e); + cmd->setBtRuntime(btRuntime); + e->commands.push_back(cmd); + } + } time_t btStopTimeout = option->getAsInt(PREF_BT_STOP_TIMEOUT); if(btStopTimeout > 0) { BtStopDownloadCommand* stopDownloadCommand = -- cgit