diff options
| author | Anton <anton@picapica> | 2017-12-30 21:06:08 +0400 |
|---|---|---|
| committer | Anton <anton@picapica> | 2017-12-30 21:06:08 +0400 |
| commit | fe90bf0b2eb78f74836b6ab7832aa06e6d48b673 (patch) | |
| tree | 206e168819d1dde81d29d8e11ab22c33646de0de /pica-client/skynet.cpp | |
| parent | 87c68a2ecadee7c86d80b585a2ed47b352c7b2d6 (diff) | |
| download | pica-pica-fe90bf0b2eb78f74836b6ab7832aa06e6d48b673.tar.gz pica-pica-fe90bf0b2eb78f74836b6ab7832aa06e6d48b673.zip | |
pica-client: implemented autoconfiguration of address for direct incoming connections
Diffstat (limited to 'pica-client/skynet.cpp')
| -rw-r--r-- | pica-client/skynet.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/pica-client/skynet.cpp b/pica-client/skynet.cpp index 8e22635..d2abb64 100644 --- a/pica-client/skynet.cpp +++ b/pica-client/skynet.cpp @@ -11,6 +11,7 @@ #include "dhparam.h" #include "askpassword.h" #include "settings.h" +#include "../PICA_netconf.h" SkyNet::SkyNet() : nodes(config_dbname), QObject(0) @@ -345,9 +346,34 @@ void SkyNet::Join(Accounts::AccountRecord &accrec) { int pub_port = st.loadValue("direct_c2c.public_port", 2298).toInt(); int loc_port = st.loadValue("direct_c2c.local_port", 2298).toInt(); + QString public_addr = st.loadValue("direct_c2c.public_addr", "autoconfigure").toString(); + + if (public_addr.contains("autoconfigure")) + { + in_addr_t guess; + struct in_addr in; + + guess = PICA_guess_listening_addr_ipv4(); + in.s_addr = guess; + public_addr = QString(inet_ntoa(in)); +#ifdef HAVE_LIBMINIUPNPC + if (st.loadValue("direct_c2c.upnp_enabled", 1).toBool() && PICA_is_reserved_addr_ipv4(guess)) + { + int ret; + char public_ip[64]; + ret = PICA_upnp_autoconfigure_ipv4(pub_port, loc_port, public_ip); + + if (ret) + { + public_addr = QString(public_ip); + } + } +#endif + emit StatusMsg(QString(tr("Using autoconfigured address %1 port %2 for incoming direct connections")).arg(public_addr).arg(pub_port), false); + } int ret = PICA_new_listener(acc, - st.loadValue("direct_c2c.public_addr", "0.0.0.0").toString().toAscii().constData(), + public_addr.toAscii().constData(), pub_port, loc_port, &listener); if (ret != PICA_OK) |
