← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2697: connection fixes

 

------------------------------------------------------------
revno: 2697
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Sun 2011-12-04 23:17:45 +0100
message:
  connection fixes
modified:
  dcpp/ConnectivityManager.cpp
  dcpp/ConnectivityManager.h
  dcpp/Socket.cpp
  dcpp/Util.cpp
  win32/MainWindow.cpp
  win32/Mapper_MiniUPnPc.cpp


--
lp:dcplusplus
https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk

Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== modified file 'dcpp/ConnectivityManager.cpp'
--- dcpp/ConnectivityManager.cpp	2011-10-25 18:53:49 +0000
+++ dcpp/ConnectivityManager.cpp	2011-12-04 22:17:45 +0000
@@ -36,14 +36,14 @@
 {
 }
 
-const string& ConnectivityManager::get(SettingsManager::StrSetting setting, bool useDefault) const {
+const string& ConnectivityManager::get(SettingsManager::StrSetting setting) const {
 	if(BOOLSETTING(AUTO_DETECT_CONNECTION)) {
 		auto i = autoSettings.find(setting);
 		if(i != autoSettings.end()) {
 			return boost::get<const string&>(i->second);
 		}
 	}
-	return SettingsManager::getInstance()->get(setting, useDefault);
+	return SettingsManager::getInstance()->get(setting);
 }
 
 int ConnectivityManager::get(SettingsManager::IntSetting setting) const {
@@ -84,8 +84,7 @@
 		SettingsManager::BIND_ADDRESS, SettingsManager::BIND_ADDRESS6, SettingsManager::INCOMING_CONNECTIONS };
 	std::for_each(settings, settings + sizeof(settings) / sizeof(settings[0]), [this](int setting) {
 		if(setting >= SettingsManager::STR_FIRST && setting < SettingsManager::STR_LAST) {
-			auto s = static_cast<SettingsManager::StrSetting>(setting);
-			autoSettings[setting] = SettingsManager::getInstance()->isDefault(s) ? string() : SettingsManager::getInstance()->getDefault(s);
+			autoSettings[setting] = SettingsManager::getInstance()->getDefault(static_cast<SettingsManager::StrSetting>(setting));
 		} else if(setting >= SettingsManager::INT_FIRST && setting < SettingsManager::INT_LAST) {
 			autoSettings[setting] = SettingsManager::getInstance()->getDefault(static_cast<SettingsManager::IntSetting>(setting));
 		}

=== modified file 'dcpp/ConnectivityManager.h'
--- dcpp/ConnectivityManager.h	2011-10-25 18:53:49 +0000
+++ dcpp/ConnectivityManager.h	2011-12-04 22:17:45 +0000
@@ -51,8 +51,7 @@
 class ConnectivityManager : public Singleton<ConnectivityManager>, public Speaker<ConnectivityManagerListener>
 {
 public:
-	/// @param useDefault return an empty string if the value hasn't been configured (rather than the SettingsManager default).
-	const string& get(SettingsManager::StrSetting setting, bool useDefault = true) const;
+	const string& get(SettingsManager::StrSetting setting) const;
 	int get(SettingsManager::IntSetting setting) const;
 	void set(SettingsManager::StrSetting setting, const string& str);
 

=== modified file 'dcpp/Socket.cpp'
--- dcpp/Socket.cpp	2011-10-22 16:41:13 +0000
+++ dcpp/Socket.cpp	2011-12-04 22:17:45 +0000
@@ -273,32 +273,15 @@
 string Socket::listen(const string& port) {
 	disconnect();
 
-	//auto &localIp = af == AF_INET ? getLocalIp4() : getLocalIp6();
-
-	auto ai = resolveAddr(/*localIp*/ "", port, AF_UNSPEC, AI_PASSIVE | AI_ADDRCONFIG);
-
 	uint16_t ret = 0;
 
 	// For server sockets we create both ipv4 and ipv6 if possible
 	// We use the same port for both sockets to deal with the fact that
 	// there's no way in ADC to have different ports for v4 and v6 TCP sockets
-	for(auto a = ai.get(); a; a = a->ai_next) {
-		if(!sock4.valid() && a->ai_family == AF_INET) {
-			create(*a);
-			if(ret != 0) {
-				((sockaddr_in*)a->ai_addr)->sin_port = ret;
-			}
-
-			check([&] { return ::bind(sock4, a->ai_addr, a->ai_addrlen); });
-			check([&] { return ::getsockname(sock4, a->ai_addr, (socklen_t*)&a->ai_addrlen); });
-			ret = ((sockaddr_in*)a->ai_addr)->sin_port;
-
-			if(type == TYPE_TCP) {
-				check([&] { return ::listen(sock4, 20); });
-			}
-		}
-
-		if(!sock6.valid() && a->ai_family == AF_INET6 && !v4only) {
+
+	if(!v4only) {
+		auto ai = resolveAddr(localIp6, port, AF_INET6, AI_PASSIVE | AI_ADDRCONFIG);
+		for(auto a = ai.get(); a && !sock6.valid(); a = a->ai_next) {
 			create(*a);
 			if(ret != 0) {
 				((sockaddr_in6*)a->ai_addr)->sin6_port = ret;
@@ -314,6 +297,22 @@
 		}
 	}
 
+	auto ai = resolveAddr(localIp4, port, AF_INET, AI_PASSIVE | AI_ADDRCONFIG);
+	for(auto a = ai.get(); a && !sock4.valid(); a = a->ai_next) {
+		create(*a);
+		if(ret != 0) {
+			((sockaddr_in*)a->ai_addr)->sin_port = ret;
+		}
+
+		check([&] { return ::bind(sock4, a->ai_addr, a->ai_addrlen); });
+		check([&] { return ::getsockname(sock4, a->ai_addr, (socklen_t*)&a->ai_addrlen); });
+		ret = ((sockaddr_in*)a->ai_addr)->sin_port;
+
+		if(type == TYPE_TCP) {
+			check([&] { return ::listen(sock4, 20); });
+		}
+	}
+
 	if(ret == 0) {
 		throw SocketException(_("Could not open port for listening"));
 	}

=== modified file 'dcpp/Util.cpp'
--- dcpp/Util.cpp	2011-10-25 18:07:46 +0000
+++ dcpp/Util.cpp	2011-12-04 22:17:45 +0000
@@ -553,8 +553,8 @@
 }
 
 string Util::getLocalIp() {
-	const auto& bindAddr = ConnectivityManager::getInstance()->get(SettingsManager::BIND_ADDRESS, false);
-	if(!bindAddr.empty()) {
+	const auto& bindAddr = CONNSETTING(BIND_ADDRESS);
+	if(!bindAddr.empty() && bindAddr != SettingsManager::getInstance()->getDefault(SettingsManager::BIND_ADDRESS)) {
 		return bindAddr;
 	}
 

=== modified file 'win32/MainWindow.cpp'
--- win32/MainWindow.cpp	2011-12-03 20:40:54 +0000
+++ win32/MainWindow.cpp	2011-12-04 22:17:45 +0000
@@ -1087,6 +1087,7 @@
 	auto prevConn = SETTING(INCOMING_CONNECTIONS);
 	auto prevMapper = SETTING(MAPPER);
 	auto prevBind = SETTING(BIND_ADDRESS);
+	auto prevBind6 = SETTING(BIND_ADDRESS6);
 
 	auto prevGeo = BOOLSETTING(GET_USER_COUNTRY);
 	auto prevGeoFormat = SETTING(COUNTRY_FORMAT);
@@ -1105,7 +1106,7 @@
 		try {
 			ConnectivityManager::getInstance()->setup(SETTING(INCOMING_CONNECTIONS) != prevConn ||
 				SETTING(TCP_PORT) != prevTCP || SETTING(UDP_PORT) != prevUDP || SETTING(TLS_PORT) != prevTLS ||
-				SETTING(MAPPER) != prevMapper || SETTING(BIND_ADDRESS) != prevBind);
+				SETTING(MAPPER) != prevMapper || SETTING(BIND_ADDRESS) != prevBind || SETTING(BIND_ADDRESS6) != prevBind6);
 		} catch (const Exception& e) {
 			showPortsError(e.getError());
 		}

=== modified file 'win32/Mapper_MiniUPnPc.cpp'
--- win32/Mapper_MiniUPnPc.cpp	2011-10-25 18:07:46 +0000
+++ win32/Mapper_MiniUPnPc.cpp	2011-12-04 22:17:45 +0000
@@ -38,9 +38,10 @@
 	if(!url.empty())
 		return true;
 
-	const auto& bindAddr = ConnectivityManager::getInstance()->get(SettingsManager::BIND_ADDRESS, false);
-
-	UPNPDev* devices = upnpDiscover(2000, bindAddr.empty() ? nullptr : bindAddr.c_str(), 0, 0, 0, 0);
+	const auto& bindAddr = CONNSETTING(BIND_ADDRESS);
+	UPNPDev* devices = upnpDiscover(2000,
+		(bindAddr.empty() || bindAddr == SettingsManager::getInstance()->getDefault(SettingsManager::BIND_ADDRESS)) ? nullptr : bindAddr.c_str(),
+		0, 0, 0, 0);
 	if(!devices)
 		return false;