Initial handshake and network game start. Works with multiple clients. Not yet stable, because it is not thread-safe. GUI callbacks not complete yet (server dialog not updated).

This commit is contained in:
lotodore
2007-03-20 02:20:50 +00:00
parent 5f7ff8ca54
commit ef10602d5c
33 changed files with 731 additions and 113 deletions
+69 -2
View File
@@ -19,6 +19,9 @@
#include <net/serverrecvstate.h>
#include <net/serverrecvthread.h>
#include <net/receiverhelper.h>
#include <net/senderthread.h>
#include <net/netpacket.h>
#include <net/socket_msg.h>
using namespace std;
@@ -48,14 +51,78 @@ ServerRecvStateInit::~ServerRecvStateInit()
}
void
ServerRecvStateInit::HandleNewConnection(ServerRecvThread &server, boost::shared_ptr<ConnectData> data)
ServerRecvStateInit::HandleNewConnection(ServerRecvThread &server, boost::shared_ptr<ConnectData> connData)
{
boost::shared_ptr<SessionData> sessionData(new SessionData);
server.AddSession(connData, sessionData);
}
int
ServerRecvStateInit::Process(ServerRecvThread &server)
{
Thread::Msleep(SERVER_WAIT_TIMEOUT_MSEC);
SOCKET recvSock = server.Select();
if (recvSock != INVALID_SOCKET)
{
boost::shared_ptr<NetPacket> packet = server.GetReceiver().Recv(recvSock);
boost::shared_ptr<SessionData> session = server.GetSession(recvSock);
// Ignore if no session / no packet.
if (packet.get() && session.get())
{
if (session->GetState() == SessionData::Init)
{
// Only accept init packets.
if (packet->ToNetPacketInit())
{
boost::shared_ptr<NetPacket> answer(new NetPacketInitAck);
server.GetSender().Send(answer, recvSock);
session->SetState(SessionData::Established);
}
else
{
// TODO send error message, invalid packet
}
}
else
{
// TODO send error message, invalid state
}
}
}
return MSG_SOCK_INIT_DONE;
}
//-----------------------------------------------------------------------------
ServerRecvStateStartGame &
ServerRecvStateStartGame::Instance()
{
static ServerRecvStateStartGame state;
return state;
}
ServerRecvStateStartGame::ServerRecvStateStartGame()
{
}
ServerRecvStateStartGame::~ServerRecvStateStartGame()
{
}
void
ServerRecvStateStartGame::HandleNewConnection(ServerRecvThread &server, boost::shared_ptr<ConnectData> connData)
{
// TODO: send error msg
}
int
ServerRecvStateStartGame::Process(ServerRecvThread &server)
{
boost::shared_ptr<NetPacket> answer(new NetPacketGameStart);
server.SendToAllClients(answer);
return MSG_SOCK_INIT_DONE;
}