Change netplay initial gctime to be determined by the hosts initial time

This commit is contained in:
Ziek 2015-02-02 02:08:58 -08:00
parent 4cdc307b87
commit 074d688884
14 changed files with 62 additions and 68 deletions

View File

@ -534,6 +534,8 @@ include_directories(Source/Core)
#
add_subdirectory(Externals/Bochs_disasm)
include_directories(Externals/Bochs_disasm)
include_directories(Externals)
add_subdirectory(Externals/enet)
if(NOT XXHASH_FOUND)
message("Using static xxhash from Externals")

View File

@ -24,6 +24,7 @@ set(SRCS BreakPoints.cpp
SysConf.cpp
Thread.cpp
Timer.cpp
TraversalClient.cpp
Version.cpp
x64ABI.cpp
x64Analyzer.cpp
@ -33,7 +34,7 @@ set(SRCS BreakPoints.cpp
Logging/ConsoleListener.cpp
Logging/LogManager.cpp)
set(LIBS enet)
if(_M_ARM)
if (_M_ARM_32) #ARMv7
set(SRCS ${SRCS}

View File

@ -1,8 +1,7 @@
// This file is public domain, in case it's useful to anyone. -comex
#include "Common/TraversalClient.h"
#include "enet/enet.h"
#include "Timer.h"
#include "Common/TraversalClient.h"
static void GetRandomishBytes(u8* buf, size_t size)
{
@ -15,11 +14,11 @@ static void GetRandomishBytes(u8* buf, size_t size)
TraversalClient::TraversalClient(ENetHost* netHost, const std::string& server)
: m_NetHost(netHost)
, m_Server(server)
, m_Client(nullptr)
, m_FailureReason(0)
, m_ConnectRequestId(0)
, m_PendingConnect(false)
, m_Server(server)
, m_PingTime(0)
{
netHost->intercept = TraversalClient::InterceptCallback;
@ -113,6 +112,8 @@ void TraversalClient::Update()
enet_packet_destroy(netEvent.packet);
break;
default:
break;
}
}
HandleResends();
@ -343,9 +344,7 @@ bool EnsureTraversalClient(const std::string& server, u16 port)
return false;
}
g_MainNetHost.reset(host);
g_TraversalClient.reset(new TraversalClient(g_MainNetHost.get(), server));
}
return true;
}

View File

@ -7,7 +7,6 @@
#include "Common/Common.h"
#include "Common/Thread.h"
#include "Common/TraversalProto.h"
#include "enet/enet.h"
class TraversalClientClient
@ -28,7 +27,6 @@ public:
Connected,
Failure
};
enum FailureReason
{
BadHost = 0x300,
@ -38,14 +36,12 @@ public:
ResendTimeout,
ConnectFailedError = 0x400,
};
TraversalClient(ENetHost* netHost, const std::string& server);
~TraversalClient();
void Reset();
void ConnectToClient(const std::string& host);
void ReconnectToServer();
void Update();
// called from NetHost
bool TestPacket(u8* data, size_t size, ENetAddress* from);
void HandleResends();
@ -63,14 +59,12 @@ private:
int tries;
enet_uint32 sendTime;
};
void HandleServerPacket(TraversalPacket* packet);
void ResendPacket(OutgoingTraversalPacketInfo* info);
TraversalRequestId SendTraversalPacket(const TraversalPacket& packet);
void OnFailure(int reason);
void HandlePing();
static int ENET_CALLBACK InterceptCallback(ENetHost* host, ENetEvent* event);
TraversalRequestId m_ConnectRequestId;
bool m_PendingConnect;
std::list<OutgoingTraversalPacketInfo> m_OutgoingTraversalPackets;
@ -78,11 +72,9 @@ private:
std::string m_Server;
enet_uint32 m_PingTime;
};
extern std::unique_ptr<TraversalClient> g_TraversalClient;
// the NetHost connected to the TraversalClient.
extern std::unique_ptr<ENetHost> g_MainNetHost;
// Create g_TraversalClient and g_MainNetHost if necessary.
bool EnsureTraversalClient(const std::string& server, u16 port);
void ReleaseTraversalClient();

View File

@ -247,6 +247,7 @@ set(LIBS
bdisasm
common
discio
enet
inputcommon
${LZO}
sfml-network

View File

@ -452,7 +452,7 @@ bool BeginRecordingInput(int controllers)
if (NetPlay::IsNetPlayRunning())
{
s_bNetPlay = true;
s_recordingStartTime = NETPLAY_INITIAL_GCTIME;
s_recordingStartTime = g_netplay_initial_gctime;
}
else
{

View File

@ -4,6 +4,8 @@
#include "Core/ConfigManager.h"
#include "Core/Core.h"
#include "Core/Movie.h"
#include "Core/NetPlayClient.h"
#include "Core/HW/EXI_DeviceIPL.h"
#include "Core/HW/SI.h"
#include "Core/HW/SI_DeviceDanceMat.h"
@ -13,8 +15,6 @@
#include "Core/HW/WiimoteReal/WiimoteReal.h"
#include "Core/IPC_HLE/WII_IPC_HLE_Device_usb.h"
#include "Core/IPC_HLE/WII_IPC_HLE_WiiMote.h"
#include "Core/Movie.h"
#include "Core/NetPlayClient.h"
static std::mutex crit_netplay_client;
static NetPlayClient * netplay_client = nullptr;
@ -57,7 +57,8 @@ NetPlayClient::~NetPlayClient()
// called from ---GUI--- thread
NetPlayClient::NetPlayClient(const std::string& address, const u16 port, NetPlayUI* dialog, const std::string& name, bool traversal)
: m_dialog(dialog)
: m_state(Failure)
, m_dialog(dialog)
, m_client(nullptr)
, m_server(nullptr)
, m_is_running(false)
@ -69,7 +70,6 @@ NetPlayClient::NetPlayClient(const std::string& address, const u16 port, NetPlay
, m_pid(0)
, m_connecting(false)
, m_traversal_client(nullptr)
, m_state(Failure)
{
m_target_buffer_size = 20;
ClearBuffers();
@ -149,6 +149,8 @@ NetPlayClient::NetPlayClient(const std::string& address, const u16 port, NetPlay
m_thread = std::thread(&NetPlayClient::ThreadFunc, this);
}
return;
default:
break;
}
}
}
@ -375,6 +377,8 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet)
g_NetPlaySettings.m_EXIDevice[0] = (TEXIDevices)tmp;
packet >> tmp;
g_NetPlaySettings.m_EXIDevice[1] = (TEXIDevices)tmp;
packet >> g_netplay_initial_gctime;
}
m_dialog->OnMsgStartGame();
@ -455,6 +459,8 @@ void NetPlayClient::Disconnect()
case ENET_EVENT_TYPE_DISCONNECT:
m_server = nullptr;
return;
default:
break;
}
}
//didn't disconnect gracefully force disconnect
@ -495,6 +501,8 @@ void NetPlayClient::ThreadFunc()
netEvent.peer->data = nullptr;
break;
default:
break;
}
}
@ -1050,7 +1058,7 @@ u32 CEXIIPL::NetPlay_GetGCTime()
std::lock_guard<std::mutex> lk(crit_netplay_client);
if (netplay_client)
return NETPLAY_INITIAL_GCTIME;
return g_netplay_initial_gctime;
else
return 0;
}

View File

@ -7,6 +7,7 @@
#include <map>
#include <queue>
#include <sstream>
#include <SFML/Network/Packet.hpp>
#include "Common/CommonTypes.h"
#include "Common/FifoQueue.h"
#include "Common/Thread.h"
@ -14,7 +15,7 @@
#include "Common/TraversalClient.h"
#include "Core/NetPlayProto.h"
#include "InputCommon/GCPadStatus.h"
#include <SFML/Network/Packet.hpp>
class NetPlayUI
{
@ -97,7 +98,7 @@ protected:
Common::FifoQueue<GCPadStatus> m_pad_buffer[4];
Common::FifoQueue<NetWiimote> m_wiimote_buffer[4];
NetPlayUI* m_dialog;
NetPlayUI* m_dialog;
ENetHost* m_client;
ENetPeer* m_server;

View File

@ -32,7 +32,7 @@ typedef std::vector<u8> NetWiimote;
#define NETPLAY_VERSION "Dolphin NetPlay 2014-01-08"
static const int NETPLAY_INITIAL_GCTIME = 1272737767;
extern int g_netplay_initial_gctime;
// messages
enum

View File

@ -4,13 +4,22 @@
#include <string>
#include <vector>
#include "Common/StdMakeUnique.h"
#include "Common/StringUtil.h"
#include "Core/HW/EXI_DeviceIPL.h"
#include "Core/NetPlayClient.h" //for NetPlayUI
#include "Core/NetPlayServer.h"
#include "Core/HW/EXI_DeviceIPL.h"
#include "InputCommon/GCPadStatus.h"
#if !defined(_WIN32)
#include <sys/types.h>
#include <sys/socket.h>
#ifndef ANDROID
#include <ifaddrs.h>
#endif
#include <arpa/inet.h>
#endif
int g_netplay_initial_gctime = 1272737767;
NetPlayServer::~NetPlayServer()
{
@ -175,6 +184,8 @@ void NetPlayServer::ThreadFunc()
}
}
break;
default:
break;
}
}
}
@ -285,7 +296,7 @@ unsigned int NetPlayServer::OnConnect(ENetPeer* socket)
// add client to the player list
{
std::lock_guard<std::recursive_mutex> lkp(m_crit.players);
m_players.emplace(player.socket->connectID, player);
m_players.insert(std::pair<u32, Client>(player.socket->connectID, player));
std::lock_guard<std::recursive_mutex> lks(m_crit.send);
UpdatePadMapping(); // sync pad mappings with everyone
UpdateWiimoteMapping();
@ -617,6 +628,8 @@ bool NetPlayServer::StartGame()
// no change, just update with clients
AdjustPadBufferSize(m_target_buffer_size);
g_netplay_initial_gctime = CEXIIPL::GetGCTime();
// tell clients to start game
sf::Packet spac;
spac << (MessageId)NP_MSG_START_GAME;
@ -630,6 +643,7 @@ bool NetPlayServer::StartGame()
spac << m_settings.m_OCFactor;
spac << m_settings.m_EXIDevice[0];
spac << m_settings.m_EXIDevice[1];
spac << g_netplay_initial_gctime;
std::lock_guard<std::recursive_mutex> lkp(m_crit.players);
std::lock_guard<std::recursive_mutex> lks(m_crit.send);
@ -712,44 +726,20 @@ std::vector<std::pair<std::string, std::string>> NetPlayServer::GetInterfaceList
std::vector<std::pair<std::string, std::string>> result;
#if defined(_WIN32)
#elif defined(__APPLE__)
// we do this to get the friendly names rather than the BSD ones. ew.
if (m_dynamic_store && m_prefs)
{
CFArrayRef ary = SCNetworkServiceCopyAll((SCPreferencesRef)m_prefs);
for (CFIndex i = 0; i < CFArrayGetCount(ary); i++)
{
SCNetworkServiceRef ifr = (SCNetworkServiceRef)CFArrayGetValueAtIndex(ary, i);
std::string name = CFStrToStr(SCNetworkServiceGetName(ifr));
CFStringRef key = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL, kSCDynamicStoreDomainState, SCNetworkServiceGetServiceID(ifr), kSCEntNetIPv4);
CFDictionaryRef props = (CFDictionaryRef)SCDynamicStoreCopyValue((SCDynamicStoreRef)m_dynamic_store, key);
CFRelease(key);
if (!props)
continue;
CFArrayRef ipary = (CFArrayRef)CFDictionaryGetValue(props, kSCPropNetIPv4Addresses);
if (ipary)
{
for (CFIndex j = 0; j < CFArrayGetCount(ipary); j++)
result.emplace_back(std::make_pair(name, CFStrToStr((CFStringRef)CFArrayGetValueAtIndex(ipary, j))));
CFRelease(ipary);
}
}
CFRelease(ary);
}
#elif defined(ANDROID)
// Android has no getifaddrs for some stupid reason. If this
// functionality ends up actually being used on Android, fix this.
#else
ifaddrs* ifp;
ifaddrs* ifp = nullptr;
char buf[512];
if (getifaddrs(&ifp) != -1)
{
for (struct ifaddrs* curifp = ifp; curifp; curifp = curifp->ifa_next)
for (ifaddrs* curifp = ifp; curifp; curifp = curifp->ifa_next)
{
struct sockaddr* sa = curifp->ifa_addr;
sockaddr* sa = curifp->ifa_addr;
if (sa->sa_family != AF_INET)
continue;
struct sockaddr_in* sai = (struct sockaddr_in*) sa;
sockaddr_in* sai = (struct sockaddr_in*) sa;
if (ntohl(((struct sockaddr_in*) sa)->sin_addr.s_addr) == 0x7f000001)
continue;
const char* ip = inet_ntop(sa->sa_family, &sai->sin_addr, buf, sizeof(buf));
@ -761,7 +751,7 @@ std::vector<std::pair<std::string, std::string>> NetPlayServer::GetInterfaceList
}
#endif
if (result.empty())
result.push_back(std::make_pair("!local!", "127.0.0.1"));
result.emplace_back(std::make_pair("!local!", "127.0.0.1"));
return result;
}

View File

@ -8,12 +8,11 @@
#include <queue>
#include <sstream>
#include <unordered_set>
#include "Common/Thread.h"
#include "Common/TraversalClient.h"
#include "Common/Timer.h"
#include "Core/NetPlayProto.h"
#include <SFML/Network/Packet.hpp>
#include "Common/Thread.h"
#include "Common/Timer.h"
#include "Common/TraversalClient.h"
#include "Core/NetPlayProto.h"
class NetPlayUI;

View File

@ -12,6 +12,7 @@
#include <wx/chartype.h>
#include <wx/checkbox.h>
#include <wx/choice.h>
#include <wx/clipbrd.h>
#include <wx/defs.h>
#include <wx/dialog.h>
#include <wx/event.h>
@ -27,7 +28,7 @@
#include <wx/string.h>
#include <wx/textctrl.h>
#include <wx/translation.h>
#include <wx/clipbrd.h>
#include "Common/CommonTypes.h"
#include "Common/FifoQueue.h"
@ -416,12 +417,12 @@ NetPlayDiag::NetPlayDiag(wxWindow* const parent, const CGameListCtrl* const game
: wxFrame(parent, wxID_ANY, _("Dolphin NetPlay"))
, m_selected_game(game)
, m_start_btn(nullptr)
, m_game_list(game_list)
, m_host_type_choice(nullptr)
, m_host_label(nullptr)
, m_host_type_choice(nullptr)
, m_host_copy_btn(nullptr)
, m_host_copy_btn_is_retry(false)
, m_is_hosting(is_hosting)
, m_game_list(game_list)
{
Bind(wxEVT_THREAD, &NetPlayDiag::OnThread, this);

View File

@ -105,8 +105,8 @@ private:
wxListBox* m_player_lbox;
wxTextCtrl* m_chat_text;
wxTextCtrl* m_chat_msg_text;
wxCheckBox* m_memcard_write;
wxTextCtrl* m_chat_msg_text;
wxCheckBox* m_memcard_write;
wxCheckBox* m_record_chkbox;
std::string m_selected_game;

View File

@ -413,8 +413,8 @@ Global
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Debug|Win32.Build.0 = Debug|Win32
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Debug|x64.ActiveCfg = Debug|x64
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Debug|x64.Build.0 = Debug|x64
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|Mixed Platforms.ActiveCfg = Release|Win32
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|Mixed Platforms.Build.0 = Release|Win32
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|Mixed Platforms.ActiveCfg = Release|x64
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|Mixed Platforms.Build.0 = Release|x64
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|Win32.ActiveCfg = Release|Win32
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|Win32.Build.0 = Release|Win32
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|x64.ActiveCfg = Release|x64