diff --git a/Source/Core/Common/TraversalClient.cpp b/Source/Core/Common/TraversalClient.cpp index 736263090d..e9e6c5939b 100644 --- a/Source/Core/Common/TraversalClient.cpp +++ b/Source/Core/Common/TraversalClient.cpp @@ -12,13 +12,14 @@ static void GetRandomishBytes(u8* buf, size_t size) buf[i] = rand() & 0xff; } -TraversalClient::TraversalClient(ENetHost* netHost, const std::string& server) +TraversalClient::TraversalClient(ENetHost* netHost, const std::string& server, const u16 port) : m_NetHost(netHost) , m_Client(nullptr) , m_FailureReason(0) , m_ConnectRequestId(0) , m_PendingConnect(false) , m_Server(server) + , m_port(port) , m_PingTime(0) { netHost->intercept = TraversalClient::InterceptCallback; @@ -34,13 +35,12 @@ TraversalClient::~TraversalClient() void TraversalClient::ReconnectToServer() { - m_Server = "vps.qoid.us"; // XXX if (enet_address_set_host(&m_ServerAddress, m_Server.c_str())) { OnFailure(BadHost); return; } - m_ServerAddress.port = 6262; + m_ServerAddress.port = m_port; m_State = Connecting; @@ -326,12 +326,13 @@ static u16 g_OldPort; bool EnsureTraversalClient(const std::string& server, u16 port) { + if (!g_MainNetHost || !g_TraversalClient || server != g_OldServer || port != g_OldPort) { g_OldServer = server; - g_OldPort = port; + g_OldPort = port ; - ENetAddress addr = { ENET_HOST_ANY, port }; + ENetAddress addr = { ENET_HOST_ANY, 0 }; ENetHost* host = enet_host_create( &addr, // address 50, // peerCount @@ -344,7 +345,7 @@ bool EnsureTraversalClient(const std::string& server, u16 port) return false; } g_MainNetHost.reset(host); - g_TraversalClient.reset(new TraversalClient(g_MainNetHost.get(), server)); + g_TraversalClient.reset(new TraversalClient(g_MainNetHost.get(), server, port)); } return true; } diff --git a/Source/Core/Common/TraversalClient.h b/Source/Core/Common/TraversalClient.h index c248e919e6..ff76d7fc71 100644 --- a/Source/Core/Common/TraversalClient.h +++ b/Source/Core/Common/TraversalClient.h @@ -36,7 +36,7 @@ public: ResendTimeout, ConnectFailedError = 0x400, }; - TraversalClient(ENetHost* netHost, const std::string& server); + TraversalClient(ENetHost* netHost, const std::string& server, const u16 port); ~TraversalClient(); void Reset(); void ConnectToClient(const std::string& host); @@ -70,6 +70,7 @@ private: std::list m_OutgoingTraversalPackets; ENetAddress m_ServerAddress; std::string m_Server; + u16 m_port; enet_uint32 m_PingTime; }; extern std::unique_ptr g_TraversalClient; diff --git a/Source/Core/Common/TraversalProto.h b/Source/Core/Common/TraversalProto.h index 32891beac6..5036c3dbcc 100644 --- a/Source/Core/Common/TraversalProto.h +++ b/Source/Core/Common/TraversalProto.h @@ -4,8 +4,8 @@ #include #include "Common/CommonTypes.h" - -typedef std::array TraversalHostId; +#define NETPLAY_CODE_SIZE 8 +typedef std::array TraversalHostId; typedef u64 TraversalRequestId; enum TraversalPacketType diff --git a/Source/Core/Core/NetPlayClient.cpp b/Source/Core/Core/NetPlayClient.cpp index 47ae698b86..3c38fac05c 100644 --- a/Source/Core/Core/NetPlayClient.cpp +++ b/Source/Core/Core/NetPlayClient.cpp @@ -55,7 +55,7 @@ NetPlayClient::~NetPlayClient() } // called from ---GUI--- thread -NetPlayClient::NetPlayClient(const std::string& address, const u16 port, NetPlayUI* dialog, const std::string& name, bool traversal) +NetPlayClient::NetPlayClient(const std::string& address, const u16 port, NetPlayUI* dialog, const std::string& name, bool traversal, std::string centralServer, u16 centralPort) : m_state(Failure) , m_dialog(dialog) , m_client(nullptr) @@ -113,8 +113,13 @@ NetPlayClient::NetPlayClient(const std::string& address, const u16 port, NetPlay } else { - //Traversal Server - if (!EnsureTraversalClient("dolphin-emu.org", 0)) + if (address.size() > NETPLAY_CODE_SIZE) + { + PanicAlertT("Host code size is to large.\nPlease recheck that you have the correct code"); + return; + } + + if (!EnsureTraversalClient(centralServer, centralPort)) return; m_client = g_MainNetHost.get(); @@ -446,8 +451,13 @@ void NetPlayClient::Send(sf::Packet& packet) void NetPlayClient::Disconnect() { ENetEvent netEvent; + m_connecting = false; m_state = Failure; - enet_peer_disconnect(m_server, 0); + if (m_server) + enet_peer_disconnect(m_server, 0); + else + return; + while (enet_host_service(m_client, &netEvent, 3000) > 0) { switch (netEvent.type) @@ -539,7 +549,7 @@ void NetPlayClient::GetPlayerList(std::string& list, std::vector& pid_list) else ss << '-'; } - ss << " | " << player->ping << "ms\n"; + ss << " |\nPing: " << player->ping << "ms\n\n"; pid_list.push_back(player->pid); } diff --git a/Source/Core/Core/NetPlayClient.h b/Source/Core/Core/NetPlayClient.h index c6e39eb099..ab5763d313 100644 --- a/Source/Core/Core/NetPlayClient.h +++ b/Source/Core/Core/NetPlayClient.h @@ -48,7 +48,7 @@ class NetPlayClient : public TraversalClientClient public: void ThreadFunc(); - NetPlayClient(const std::string& address, const u16 port, NetPlayUI* dialog, const std::string& name, bool traversal); + NetPlayClient(const std::string& address, const u16 port, NetPlayUI* dialog, const std::string& name, bool traversal, std::string centralServer, u16 centralPort); ~NetPlayClient(); void GetPlayerList(std::string& list, std::vector& pid_list); diff --git a/Source/Core/Core/NetPlayServer.cpp b/Source/Core/Core/NetPlayServer.cpp index 03ef95523c..79acbb6918 100644 --- a/Source/Core/Core/NetPlayServer.cpp +++ b/Source/Core/Core/NetPlayServer.cpp @@ -4,6 +4,7 @@ #include #include +#include "Common/IniFile.h" #include "Common/StdMakeUnique.h" #include "Common/StringUtil.h" #include "Core/NetPlayClient.h" //for NetPlayUI @@ -50,7 +51,7 @@ NetPlayServer::~NetPlayServer() } // called from ---GUI--- thread -NetPlayServer::NetPlayServer(const u16 port, bool traversal) +NetPlayServer::NetPlayServer(const u16 port, bool traversal, std::string centralServer, u16 centralPort) : is_connected(false) , m_is_running(false) , m_do_loop(false) @@ -73,7 +74,7 @@ NetPlayServer::NetPlayServer(const u16 port, bool traversal) memset(m_wiimote_map, -1, sizeof(m_wiimote_map)); if (traversal) { - if (!EnsureTraversalClient("dolphin-emu.org", 0)) + if (!EnsureTraversalClient(centralServer, centralPort)) return; g_TraversalClient->m_Client = this; @@ -797,10 +798,10 @@ void NetPlayServer::TryPortmapping(u16 port) // UPnP thread: try to map a port void NetPlayServer::mapPortThread(const u16 port) { - ENetAddress adr; + ENetAddress adr = { ENET_HOST_ANY, port }; char cIP[20]; - enet_address_get_host_ip(&adr, cIP, 20); + enet_address_get_host(&adr, cIP, 20); std::string ourIP(cIP); if (!m_upnp_inited) @@ -895,8 +896,8 @@ bool NetPlayServer::UPnPMapPort(const std::string& addr, const u16 port) std::string port_str = StringFromFormat("%d", port); int result = UPNP_AddPortMapping(m_upnp_urls.controlURL, m_upnp_data.first.servicetype, port_str.c_str(), port_str.c_str(), addr.c_str(), - (std::string("dolphin-emu TCP on ") + addr).c_str(), - "TCP", nullptr, nullptr); + (std::string("dolphin-emu UDP on ") + addr).c_str(), + "UDP", nullptr, nullptr); if (result != 0) return false; @@ -918,7 +919,7 @@ bool NetPlayServer::UPnPUnmapPort(const u16 port) { std::string port_str = StringFromFormat("%d", port); UPNP_DeletePortMapping(m_upnp_urls.controlURL, m_upnp_data.first.servicetype, - port_str.c_str(), "TCP", nullptr); + port_str.c_str(), "UDP", nullptr); return true; } diff --git a/Source/Core/Core/NetPlayServer.h b/Source/Core/Core/NetPlayServer.h index 93e28afb57..5e8ac76411 100644 --- a/Source/Core/Core/NetPlayServer.h +++ b/Source/Core/Core/NetPlayServer.h @@ -21,7 +21,7 @@ class NetPlayServer : public TraversalClientClient public: void ThreadFunc(); - NetPlayServer(const u16 port, bool traversal); + NetPlayServer(const u16 port, bool traversal, std::string centralServer, u16 centralPort); ~NetPlayServer(); bool ChangeGame(const std::string& game); diff --git a/Source/Core/DolphinWX/NetWindow.cpp b/Source/Core/DolphinWX/NetWindow.cpp index c06348be5f..0768b615ed 100644 --- a/Source/Core/DolphinWX/NetWindow.cpp +++ b/Source/Core/DolphinWX/NetWindow.cpp @@ -105,16 +105,49 @@ NetPlaySetupDiag::NetPlaySetupDiag(wxWindow* const parent, const CGameListCtrl* wxPanel* const panel = new wxPanel(this); // top row - wxStaticText* const nick_lbl = new wxStaticText(panel, wxID_ANY, _("Nickname :")); + wxBoxSizer* const trav_szr = new wxBoxSizer(wxHORIZONTAL); + m_direct_traversal = new wxChoice(panel, wxID_ANY, wxDefaultPosition, wxSize(75, -1)); + m_direct_traversal->Bind(wxEVT_COMMAND_CHOICE_SELECTED, &NetPlaySetupDiag::OnChoice, this); + m_direct_traversal->Append(_("Direct")); + m_direct_traversal->Append(_("Traversal")); + + std::string travChoice; + netplay_section.Get("TraversalChoice", &travChoice, "direct"); + + if (travChoice == "traversal") + { + m_direct_traversal->Select(1); + } + else + { + m_direct_traversal->Select(0); + } + + trav_szr->Add(m_direct_traversal, 0, wxRIGHT); + + wxBoxSizer* const nick_szr = new wxBoxSizer(wxHORIZONTAL); + wxStaticText* const nick_lbl = new wxStaticText(panel, wxID_ANY, _("Nickname :")); std::string nickname; netplay_section.Get("Nickname", &nickname, "Player"); m_nickname_text = new wxTextCtrl(panel, wxID_ANY, StrToWxStr(nickname)); - - wxBoxSizer* const nick_szr = new wxBoxSizer(wxHORIZONTAL); nick_szr->Add(nick_lbl, 0, wxCENTER); nick_szr->Add(m_nickname_text, 0, wxALL, 5); + std::string centralServer; + netplay_section.Get("TraversalServer", ¢ralServer, "vps.qoid.us"); + m_traversal_server_lbl = new wxStaticText(panel, wxID_ANY, _("Traversal:")); + m_traversal_server = new wxTextCtrl(panel, wxID_ANY, StrToWxStr(centralServer)); + nick_szr->Add(m_traversal_server_lbl, 0, wxCENTER); + nick_szr->Add(m_traversal_server, 0, wxALL, 5); + + std::string centralPort; + netplay_section.Get("TraversalPort", ¢ralPort, "6262"); + m_traversal_port_lbl = new wxStaticText(panel, wxID_ANY, _("Port:")); + m_traversal_port = new wxTextCtrl(panel, wxID_ANY, StrToWxStr(centralPort)); + nick_szr->Add(m_traversal_port_lbl, 0, wxCENTER); + nick_szr->Add(m_traversal_port, 0, wxALL, 5); + // tabs wxNotebook* const notebook = new wxNotebook(panel, wxID_ANY); wxPanel* const connect_tab = new wxPanel(notebook, wxID_ANY); @@ -122,12 +155,6 @@ NetPlaySetupDiag::NetPlaySetupDiag(wxWindow* const parent, const CGameListCtrl* wxPanel* const host_tab = new wxPanel(notebook, wxID_ANY); notebook->AddPage(host_tab, _("Host")); - m_direct_traversal = new wxChoice(panel, wxID_ANY, wxDefaultPosition, wxSize(75, -1)); - m_direct_traversal->Bind(wxEVT_COMMAND_CHOICE_SELECTED, &NetPlaySetupDiag::OnChoice, this); - m_direct_traversal->Append(_("Traversal")); - m_direct_traversal->Append(_("Direct")); - m_direct_traversal->Select(0); - // connect tab { m_ip_lbl = new wxStaticText(connect_tab, wxID_ANY, _("Host Code :")); @@ -215,7 +242,8 @@ NetPlaySetupDiag::NetPlaySetupDiag(wxWindow* const parent, const CGameListCtrl* // main sizer wxBoxSizer* const main_szr = new wxBoxSizer(wxVERTICAL); - main_szr->Add(nick_szr, 0, wxALL | wxALIGN_RIGHT, 5); + main_szr->Add(trav_szr, 0, wxALL | wxALIGN_LEFT); + main_szr->Add(nick_szr, 0, wxALL | wxALIGN_LEFT, 5); main_szr->Add(notebook, 1, wxLEFT | wxRIGHT | wxEXPAND, 5); main_szr->Add(quit_btn, 0, wxALL | wxALIGN_RIGHT, 5); @@ -231,18 +259,8 @@ NetPlaySetupDiag::NetPlaySetupDiag(wxWindow* const parent, const CGameListCtrl* Show(); // Needs to be done last or it set up the spacing on the page correctly - //client tab - { - m_client_port_lbl->Show(false); - m_connect_port_text->Show(false); - } - - //server tab - { - m_host_port_lbl->Show(false); - m_host_port_text->Show(false); - m_upnp_chk->Show(false); - } + wxCommandEvent ev; + OnChoice(ev); } @@ -253,8 +271,22 @@ NetPlaySetupDiag::~NetPlaySetupDiag() inifile.Load(dolphin_ini); IniFile::Section& netplay_section = *inifile.GetOrCreateSection("NetPlay"); + std::string travChoice = "traversal"; + if (m_direct_traversal->GetSelection() == 1) + { + netplay_section.Set("TraversalChoice", travChoice); + } + else + { + travChoice = "direct"; + netplay_section.Set("TraversalChoice", travChoice); + } + netplay_section.Set("Nickname", WxStrToStr(m_nickname_text->GetValue())); - if (m_direct_traversal->GetCurrentSelection() == 1) + netplay_section.Set("TraversalServer", WxStrToStr(m_traversal_server->GetValue())); + netplay_section.Set("TraversalPort", WxStrToStr(m_traversal_port->GetValue())); + + if (m_direct_traversal->GetCurrentSelection() == 0) { netplay_section.Set("Address", WxStrToStr(m_connect_ip_text->GetValue())); } @@ -280,12 +312,14 @@ void NetPlaySetupDiag::MakeNetPlayDiag(int port, const std::string &game, bool i ip = WxStrToStr(m_connect_ip_text->GetValue()); bool trav; - if (!is_hosting && m_direct_traversal->GetCurrentSelection() == 0) + if (!is_hosting && m_direct_traversal->GetCurrentSelection() == 1) trav = true; else trav = false; - netplay_client = new NetPlayClient(ip, (u16)port, npd, WxStrToStr(m_nickname_text->GetValue()), trav); + unsigned long centralPort = 0; + m_traversal_port->GetValue().ToULong(¢ralPort); + netplay_client = new NetPlayClient(ip, (u16)port, npd, WxStrToStr(m_nickname_text->GetValue()), trav, WxStrToStr(m_traversal_server->GetValue()), (u16)centralPort); if (netplay_client->is_connected) { npd->Show(); @@ -315,14 +349,17 @@ void NetPlaySetupDiag::OnHost(wxCommandEvent&) std::string game(WxStrToStr(m_game_lbox->GetStringSelection())); bool trav; - if (m_direct_traversal->GetCurrentSelection() == 0) + if (m_direct_traversal->GetCurrentSelection() == 1) trav = true; else trav = false; unsigned long port = 0; m_host_port_text->GetValue().ToULong(&port); - netplay_server = new NetPlayServer(u16(port), trav); + + unsigned long centralPort = 0; + m_traversal_port->GetValue().ToULong(¢ralPort); + netplay_server = new NetPlayServer(u16(port), trav, WxStrToStr(m_traversal_server->GetValue()), u16(centralPort)); netplay_server->ChangeGame(game); netplay_server->AdjustPadBufferSize(INITIAL_PAD_BUFFER_SIZE); if (netplay_server->is_connected) @@ -361,8 +398,14 @@ void NetPlaySetupDiag::OnChoice(wxCommandEvent& event) inifile.Load(File::GetUserPath(D_CONFIG_IDX) + "Dolphin.ini"); IniFile::Section& netplay_section = *inifile.GetOrCreateSection("NetPlay"); - if (sel == 0) + if (sel == 1) { + m_traversal_server_lbl->Show(true); + m_traversal_server->Show(true); + + m_traversal_port_lbl->Show(true); + m_traversal_port->Show(true); + //Traversal //client tab { @@ -385,6 +428,11 @@ void NetPlaySetupDiag::OnChoice(wxCommandEvent& event) } else { + m_traversal_server_lbl->Show(false); + m_traversal_server->Show(false); + + m_traversal_port_lbl->Show(false); + m_traversal_port->Show(false); //Direct //client tab { diff --git a/Source/Core/DolphinWX/NetWindow.h b/Source/Core/DolphinWX/NetWindow.h index 03dc0b5def..d5b2ef12b6 100644 --- a/Source/Core/DolphinWX/NetWindow.h +++ b/Source/Core/DolphinWX/NetWindow.h @@ -52,6 +52,10 @@ private: wxTextCtrl* m_connect_port_text; wxTextCtrl* m_connect_ip_text; wxChoice* m_direct_traversal; + wxStaticText* m_traversal_server_lbl; + wxTextCtrl* m_traversal_server; + wxStaticText* m_traversal_port_lbl; + wxTextCtrl* m_traversal_port; wxListBox* m_game_lbox; #ifdef USE_UPNP