Bläddra i källkod

2009-01-31 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	Choose port for BitTorrent/DHT randomly from the specified
	range.
	* src/DHTConnectionImpl.cc
	* src/PeerListenCommand.cc
Tatsuhiro Tsujikawa 16 år sedan
förälder
incheckning
dbc8f687c1
3 ändrade filer med 29 tillägg och 8 borttagningar
  1. 6 0
      ChangeLog
  2. 11 4
      src/DHTConnectionImpl.cc
  3. 12 4
      src/PeerListenCommand.cc

+ 6 - 0
ChangeLog

@@ -1,3 +1,9 @@
+2009-01-31  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Choose port for BitTorrent/DHT randomly from the specified range.
+	* src/DHTConnectionImpl.cc
+	* src/PeerListenCommand.cc
+
 2009-01-31  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Send HTTP Authorization header only if it is requested by the

+ 11 - 4
src/DHTConnectionImpl.cc

@@ -35,12 +35,15 @@
 #include "DHTConnectionImpl.h"
 
 #include <utility>
+#include <deque>
+#include <algorithm>
 
 #include "LogFactory.h"
 #include "Logger.h"
 #include "RecoverableException.h"
 #include "Util.h"
 #include "Socket.h"
+#include "SimpleRandomizer.h"
 
 namespace aria2 {
 
@@ -51,12 +54,16 @@ DHTConnectionImpl::~DHTConnectionImpl() {}
 
 bool DHTConnectionImpl::bind(uint16_t& port, IntSequence& ports)
 {
-  while(ports.hasNext()) {
-    int sport = ports.next();
-    if(!(0 < sport && 0 <= UINT16_MAX)) {
+  std::deque<int32_t> randPorts = ports.flush();
+  std::random_shuffle(randPorts.begin(), randPorts.end(),
+		      *SimpleRandomizer::getInstance().get());
+  
+  for(std::deque<int32_t>::const_iterator portItr = randPorts.begin();
+      portItr != randPorts.end(); ++portItr) {
+    if(!(0 < (*portItr) && (*portItr) <= UINT16_MAX)) {
       continue;
     }
-    port = sport;
+    port = (*portItr);
     if(bind(port)) {
       return true;
     }

+ 12 - 4
src/PeerListenCommand.cc

@@ -35,6 +35,8 @@
 #include "PeerListenCommand.h"
 
 #include <utility>
+#include <deque>
+#include <algorithm>
 
 #include "DownloadEngine.h"
 #include "Peer.h"
@@ -44,6 +46,7 @@
 #include "ReceiverMSEHandshakeCommand.h"
 #include "Logger.h"
 #include "Socket.h"
+#include "SimpleRandomizer.h"
 
 namespace aria2 {
 
@@ -67,12 +70,17 @@ PeerListenCommand::~PeerListenCommand()
 bool PeerListenCommand::bindPort(uint16_t& port, IntSequence& seq)
 {
   socket.reset(new SocketCore());
-  while(seq.hasNext()) {
-    int sport = seq.next();
-    if(!(0 < sport && sport <= UINT16_MAX)) {
+
+  std::deque<int32_t> randPorts = seq.flush();
+  std::random_shuffle(randPorts.begin(), randPorts.end(),
+		      *SimpleRandomizer::getInstance().get());
+  
+  for(std::deque<int32_t>::const_iterator portItr = randPorts.begin();
+      portItr != randPorts.end(); ++portItr) {
+    if(!(0 < (*portItr) && (*portItr) <= UINT16_MAX)) {
       continue;
     }
-    port = sport;
+    port = (*portItr);
     try {
       socket->bind(port);
       socket->beginListen();