linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #04863
[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;