mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-26 15:50:00 -06:00
start encapsulating LAN
This commit is contained in:
177
src/net/LAN.h
177
src/net/LAN.h
@ -22,77 +22,128 @@
|
||||
#include <string>
|
||||
#include <map>
|
||||
|
||||
#include <enet/enet.h>
|
||||
|
||||
#ifndef socket_t
|
||||
#ifdef __WIN32__
|
||||
#include <winsock2.h>
|
||||
#define socket_t SOCKET
|
||||
#else
|
||||
#define socket_t int
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "types.h"
|
||||
#include "Platform.h"
|
||||
#include "MPInterface.h"
|
||||
|
||||
namespace LAN
|
||||
namespace melonDS
|
||||
{
|
||||
using namespace melonDS;
|
||||
|
||||
enum PlayerStatus
|
||||
class LAN : public MPInterface
|
||||
{
|
||||
Player_None = 0, // no player in this entry
|
||||
Player_Client, // game client
|
||||
Player_Host, // game host
|
||||
Player_Connecting, // player still connecting
|
||||
Player_Disconnected, // player disconnected
|
||||
public:
|
||||
LAN() noexcept;
|
||||
LAN(const LAN&) = delete;
|
||||
LAN& operator=(const LAN&) = delete;
|
||||
LAN(LAN&& other) = delete;
|
||||
LAN& operator=(LAN&& other) = delete;
|
||||
~LAN() noexcept;
|
||||
|
||||
enum PlayerStatus
|
||||
{
|
||||
Player_None = 0, // no player in this entry
|
||||
Player_Client, // game client
|
||||
Player_Host, // game host
|
||||
Player_Connecting, // player still connecting
|
||||
Player_Disconnected, // player disconnected
|
||||
};
|
||||
|
||||
struct Player
|
||||
{
|
||||
int ID;
|
||||
char Name[32];
|
||||
PlayerStatus Status;
|
||||
u32 Address;
|
||||
};
|
||||
|
||||
struct DiscoveryData
|
||||
{
|
||||
u32 Magic;
|
||||
u32 Version;
|
||||
u32 Tick;
|
||||
char SessionName[64];
|
||||
u8 NumPlayers;
|
||||
u8 MaxPlayers;
|
||||
u8 Status; // 0=idle 1=playing
|
||||
};
|
||||
|
||||
bool StartDiscovery();
|
||||
void EndDiscovery();
|
||||
bool StartHost(const char* player, int numplayers);
|
||||
bool StartClient(const char* player, const char* host);
|
||||
|
||||
std::map<u32, DiscoveryData> GetDiscoveryList();
|
||||
std::vector<Player> GetPlayerList();
|
||||
|
||||
void Process() override;
|
||||
|
||||
void Begin(int inst) override;
|
||||
void End(int inst) override;
|
||||
|
||||
int SendPacket(int inst, u8* data, int len, u64 timestamp) override;
|
||||
int RecvPacket(int inst, u8* data, u64* timestamp) override;
|
||||
int SendCmd(int inst, u8* data, int len, u64 timestamp) override;
|
||||
int SendReply(int inst, u8* data, int len, u64 timestamp, u16 aid) override;
|
||||
int SendAck(int inst, u8* data, int len, u64 timestamp) override;
|
||||
int RecvHostPacket(int inst, u8* data, u64* timestamp) override;
|
||||
u16 RecvReplies(int inst, u8* data, u64 timestamp, u16 aidmask) override;
|
||||
|
||||
private:
|
||||
bool Inited;
|
||||
bool Active;
|
||||
bool IsHost;
|
||||
|
||||
ENetHost* Host;
|
||||
ENetPeer* RemotePeers[16];
|
||||
|
||||
socket_t DiscoverySocket;
|
||||
u32 DiscoveryLastTick;
|
||||
std::map<u32, DiscoveryData> DiscoveryList;
|
||||
Platform::Mutex* DiscoveryMutex;
|
||||
|
||||
Player Players[16];
|
||||
u32 PlayerPing[16];
|
||||
int NumPlayers;
|
||||
int MaxPlayers;
|
||||
Platform::Mutex* PlayersMutex;
|
||||
|
||||
Player MyPlayer;
|
||||
u32 HostAddress;
|
||||
|
||||
u16 ConnectedBitmask;
|
||||
|
||||
int MPRecvTimeout;
|
||||
int LastHostID;
|
||||
ENetPeer* LastHostPeer;
|
||||
std::queue<ENetPacket*> RXQueue;
|
||||
|
||||
u32 FrameCount;
|
||||
|
||||
void ProcessDiscovery();
|
||||
|
||||
void HostUpdatePlayerList();
|
||||
void ClientUpdatePlayerList();
|
||||
|
||||
void ProcessHostEvent(ENetEvent& event);
|
||||
void ProcessClientEvent(ENetEvent& event);
|
||||
void ProcessEvent(ENetEvent& event);
|
||||
void ProcessLAN(int type);
|
||||
|
||||
int SendPacketGeneric(u32 type, u8* packet, int len, u64 timestamp);
|
||||
int RecvPacketGeneric(u8* packet, bool block, u64* timestamp);
|
||||
};
|
||||
|
||||
struct Player
|
||||
{
|
||||
int ID;
|
||||
char Name[32];
|
||||
PlayerStatus Status;
|
||||
u32 Address;
|
||||
};
|
||||
|
||||
struct DiscoveryData
|
||||
{
|
||||
u32 Magic;
|
||||
u32 Version;
|
||||
u32 Tick;
|
||||
char SessionName[64];
|
||||
u8 NumPlayers;
|
||||
u8 MaxPlayers;
|
||||
u8 Status; // 0=idle 1=playing
|
||||
};
|
||||
|
||||
|
||||
extern bool Active;
|
||||
|
||||
extern std::map<u32, DiscoveryData> DiscoveryList;
|
||||
extern Platform::Mutex* DiscoveryMutex; // TODO: turn into Platform::Mutex or rework this to be nicer
|
||||
|
||||
extern Player Players[16];
|
||||
extern u32 PlayerPing[16];
|
||||
extern int NumPlayers;
|
||||
extern int MaxPlayers;
|
||||
|
||||
extern Player MyPlayer;
|
||||
extern u32 HostAddress;
|
||||
|
||||
bool Init();
|
||||
void DeInit();
|
||||
|
||||
bool StartDiscovery();
|
||||
void EndDiscovery();
|
||||
bool StartHost(const char* player, int numplayers);
|
||||
bool StartClient(const char* player, const char* host);
|
||||
|
||||
void ProcessFrame();
|
||||
|
||||
void SetMPRecvTimeout(int timeout);
|
||||
void MPBegin();
|
||||
void MPEnd();
|
||||
|
||||
int SendMPPacket(u8* data, int len, u64 timestamp);
|
||||
int RecvMPPacket(u8* data, u64* timestamp);
|
||||
int SendMPCmd(u8* data, int len, u64 timestamp);
|
||||
int SendMPReply(u8* data, int len, u64 timestamp, u16 aid);
|
||||
int SendMPAck(u8* data, int len, u64 timestamp);
|
||||
int RecvMPHostPacket(u8* data, u64* timestamp);
|
||||
u16 RecvMPReplies(u8* data, u64 timestamp, u16 aidmask);
|
||||
|
||||
}
|
||||
|
||||
#endif // LAN_H
|
||||
|
Reference in New Issue
Block a user