summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
Diffstat (limited to 'node')
-rw-r--r--node/SelfAwareness.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/node/SelfAwareness.cpp b/node/SelfAwareness.cpp
index cf43a644..dde77ee5 100644
--- a/node/SelfAwareness.cpp
+++ b/node/SelfAwareness.cpp
@@ -150,14 +150,24 @@ std::vector<InetAddress> SelfAwareness::getSymmetricNatPredictions()
// More than one global IPv4 surface means this is a symmetric NAT
std::vector<InetAddress> r;
for(std::set<InetAddress>::iterator i(surfaces.begin());i!=surfaces.end();++i) {
- InetAddress nextPort(*i);
- unsigned int p = nextPort.port();
- if (p >= 65535)
+ InetAddress ipp(*i);
+ unsigned int p = ipp.port();
+
+ // Try 1+ surface ports
+ if (p >= 0xffff)
+ p = 1025;
+ else ++p;
+ ipp.setPort(p);
+ if ((surfaces.count(ipp) == 0)&&(std::find(r.begin(),r.end(),ipp) == r.end()))
+ r.push_back(ipp);
+
+ // Try 2+ surface ports
+ if (p >= 0xffff)
p = 1025;
else ++p;
- nextPort.setPort(p);
- if (surfaces.count(nextPort) == 0)
- r.push_back(nextPort);
+ ipp.setPort(p);
+ if ((surfaces.count(ipp) == 0)&&(std::find(r.begin(),r.end(),ipp) == r.end()))
+ r.push_back(ipp);
}
return r;
}