From 2fd09506bcf4892ad73e30497d4e8421ca488eb8 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 14 Nov 2009 23:10:25 +0000 Subject: [PATCH] sorting of ip addresses before use, to test the most recent ones first git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.4.x@1827 b45a01b8-16f6-495d-af2f-9b41ad6348cc --- libretroshare/src/pqi/p3connmgr.cc | 22 ++++++++++++++++------ libretroshare/src/rsserver/p3peers.cc | 12 +++++++----- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/libretroshare/src/pqi/p3connmgr.cc b/libretroshare/src/pqi/p3connmgr.cc index 31099e33b..c70c6b59a 100644 --- a/libretroshare/src/pqi/p3connmgr.cc +++ b/libretroshare/src/pqi/p3connmgr.cc @@ -1355,8 +1355,6 @@ void p3ConnectMgr::getOthersList(std::list &peers) return; } - - bool p3ConnectMgr::connectAttempt(std::string id, struct sockaddr_in &addr, uint32_t &delay, uint32_t &period, uint32_t &type) @@ -1387,17 +1385,29 @@ bool p3ConnectMgr::connectAttempt(std::string id, struct sockaddr_in &addr, return false; } + // Sort addresses by reverse time stamp, so as to use the most relevant one first. + + std::list::iterator it2(it->second.connAddrs.begin()), best_it(it->second.connAddrs.begin()) ; + + for(;it2!=it->second.connAddrs.end();++it2) + { + std::cerr << "Examining " << inet_ntoa((*it2).addr.sin_addr) << ", time stamp = " << (*it2).ts << std::endl ; + + if( (*it2).ts > (*best_it).ts) + best_it = it2 ; + } + it->second.lastattempt = time(NULL); /* time of last connect attempt */ it->second.inConnAttempt = true; - it->second.currentConnAddr = it->second.connAddrs.front(); - it->second.connAddrs.pop_front(); + it->second.currentConnAddr = *best_it ; + it->second.connAddrs.erase(best_it) ; addr = it->second.currentConnAddr.addr; delay = it->second.currentConnAddr.delay; period = it->second.currentConnAddr.period; type = it->second.currentConnAddr.type; -#ifdef CONN_DEBUG +//#ifdef CONN_DEBUG std::cerr << "p3ConnectMgr::connectAttempt() Success: "; std::cerr << " id: " << id; std::cerr << std::endl; @@ -1407,7 +1417,7 @@ bool p3ConnectMgr::connectAttempt(std::string id, struct sockaddr_in &addr, std::cerr << " period: " << period; std::cerr << " type: " << type; std::cerr << std::endl; -#endif +//#endif return true; } diff --git a/libretroshare/src/rsserver/p3peers.cc b/libretroshare/src/rsserver/p3peers.cc index 0c86fd72c..519ab5801 100644 --- a/libretroshare/src/rsserver/p3peers.cc +++ b/libretroshare/src/rsserver/p3peers.cc @@ -248,13 +248,15 @@ bool p3Peers::isFriend(std::string id) return false; } -static struct sockaddr_in getPreferredAddress( const struct sockaddr_in& addr1,time_t ts1, +static struct sockaddr_in getPreferredAddress( const struct sockaddr_in& addr0,time_t ts0, + const struct sockaddr_in& addr1,time_t ts1, const struct sockaddr_in& addr2,time_t ts2, const struct sockaddr_in& addr3,time_t ts3) { - time_t ts = ts1 ; - struct sockaddr_in addr = addr1 ; + time_t ts = ts0 ; + struct sockaddr_in addr = addr0 ; + if(ts1 > ts && strcmp(inet_ntoa(addr1.sin_addr),"0.0.0.0")) { ts = ts1 ; addr = addr1 ; } if(ts2 > ts && strcmp(inet_ntoa(addr2.sin_addr),"0.0.0.0")) { ts = ts2 ; addr = addr2 ; } if(ts3 > ts && strcmp(inet_ntoa(addr3.sin_addr),"0.0.0.0")) { ts = ts3 ; addr = addr3 ; } @@ -315,8 +317,8 @@ bool p3Peers::getPeerDetails(std::string id, RsPeerDetails &d) } // From all addresses, show the most recent one if no address is currently in use. - struct sockaddr_in best_local_addr = (!strcmp(inet_ntoa(pcs.localaddr.sin_addr),"0.0.0.0"))?getPreferredAddress(pcs.dht.laddr,pcs.dht.ts,pcs.disc.laddr,pcs.disc.ts,pcs.peer.laddr,pcs.peer.ts):pcs.localaddr ; - struct sockaddr_in best_servr_addr = (!strcmp(inet_ntoa(pcs.serveraddr.sin_addr),"0.0.0.0"))?getPreferredAddress(pcs.dht.raddr,pcs.dht.ts,pcs.disc.raddr,pcs.disc.ts,pcs.peer.raddr,pcs.peer.ts):pcs.serveraddr ; + struct sockaddr_in best_local_addr = getPreferredAddress(pcs.localaddr,pcs.lastcontact,pcs.dht.laddr,pcs.dht.ts,pcs.disc.laddr,pcs.disc.ts,pcs.peer.laddr,pcs.peer.ts); + struct sockaddr_in best_servr_addr = getPreferredAddress(pcs.serveraddr,pcs.lastcontact,pcs.dht.raddr,pcs.dht.ts,pcs.disc.raddr,pcs.disc.ts,pcs.peer.raddr,pcs.peer.ts); /* fill from pcs */