|
@@ -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;
|
|
|
}
|