changed the packet parsing so that one packet can contain more than one command

This commit is contained in:
Benjamin Berkels 2018-08-19 17:01:55 +02:00
parent a07f8feb75
commit f3a509ac2d
5 changed files with 52 additions and 21 deletions

View file

@ -103,14 +103,24 @@ void NetClient::Update()
}
else
{
NetPacketType type = (NetPacketType)packet.stream.ReadByte();
switch (type)
if (packet.stream.ReadByte () != 0)
{
default: OnClose(packet); break;
case NetPacketType::ConnectResponse: OnConnectResponse(packet); break;
case NetPacketType::Disconnect: OnDisconnect(packet); break;
case NetPacketType::Tic: OnTic(packet); break;
Printf ("Error parsing packet. Unexpected header.\n");
break;
}
while ( packet.stream.IsAtEnd() == false )
{
NetPacketType type = (NetPacketType)packet.stream.ReadByte();
switch (type)
{
default: OnClose(packet); break;
case NetPacketType::ConnectResponse: OnConnectResponse(packet); break;
case NetPacketType::Disconnect: OnDisconnect(packet); break;
case NetPacketType::Tic: OnTic(packet); break;
}
}
break;
}
if (mStatus == NodeStatus::Closed)
@ -226,9 +236,6 @@ void NetClient::OnClose(const NetPacket &packet)
void NetClient::OnConnectResponse(NetPacket &packet)
{
if (packet.size != 3)
return;
int version = packet.stream.ReadByte(); // Protocol version
if (version == 1)
{
@ -269,9 +276,6 @@ void NetClient::OnDisconnect(const NetPacket &packet)
void NetClient::OnTic(NetPacket &packet)
{
if (packet.size != 2 + sizeof(float) * 5)
return;
int tic = packet.stream.ReadByte();
float x = packet.stream.ReadFloat();
float y = packet.stream.ReadFloat();

View file

@ -91,14 +91,24 @@ void NetServer::Update()
}
else
{
NetPacketType type = (NetPacketType)packet.stream.ReadByte();
switch (type)
if (packet.stream.ReadByte () != 0)
{
default: OnClose(node, packet); break;
case NetPacketType::ConnectRequest: OnConnectRequest(node, packet); break;
case NetPacketType::Disconnect: OnDisconnect(node, packet); break;
case NetPacketType::Tic: OnTic(node, packet); break;
Printf ("Error parsing packet. Unexpected header.\n");
break;
}
while ( packet.stream.IsAtEnd() == false )
{
NetPacketType type = (NetPacketType)packet.stream.ReadByte();
switch (type)
{
default: OnClose(node, packet); break;
case NetPacketType::ConnectRequest: OnConnectRequest(node, packet); break;
case NetPacketType::Disconnect: OnDisconnect(node, packet); break;
case NetPacketType::Tic: OnTic(node, packet); break;
}
}
break;
}
}
}
@ -297,9 +307,6 @@ void NetServer::OnTic(NetNode &node, NetPacket &packet)
{
if (node.Status == NodeStatus::InGame)
{
if (packet.size != 2 + sizeof(usercmd_t))
return;
/* gametic */ packet.stream.ReadByte();
packet.stream.ReadBuffer ( &mCurrentInput[node.Player].ucmd, sizeof(usercmd_t));
}

View file

@ -324,6 +324,13 @@ void BYTESTREAM_s::WriteHeader( int Byte )
this->bitShift = -1;
}
//*****************************************************************************
//
bool BYTESTREAM_s::IsAtEnd() const
{
return ( this->pbStream >= this->pbStreamEnd );
}
//*****************************************************************************
//
void BYTESTREAM_s::WriteBit( bool bit )
@ -669,6 +676,13 @@ void NetCommand::writeCommandToStream ( BYTESTREAM_s &ByteStream ) const
//
void NetCommand::writeCommandToPacket ( NetPacket &response ) const
{
// The packet is empty, let it start with a header.
if ( response.size == 0 )
{
response.stream.WriteByte ( 0 ); // Header
response.size = 1;
}
const int size = _buffer.CalcSize();
memcpy( response.data + response.size, _buffer.pbData, _buffer.CalcSize() );
response.size += _buffer.CalcSize();

View file

@ -80,6 +80,8 @@ struct BYTESTREAM_s
void WriteHeader( int Byte );
bool IsAtEnd() const;
// Pointer to our stream of data.
uint8_t *pbStream;

View file

@ -280,6 +280,7 @@ void DoomComImpl::PacketGet(NetPacket &packet)
Close(i);
packet.node = i;
packet.size = 0;
packet.stream.pbStreamEnd = packet.stream.pbStream;
return;
}
}
@ -302,6 +303,7 @@ void DoomComImpl::PacketGet(NetPacket &packet)
Close(node);
packet.node = node;
packet.size = 0;
packet.stream.pbStreamEnd = packet.stream.pbStream;
return;
}
else if (err != WSAEWOULDBLOCK)
@ -312,6 +314,7 @@ void DoomComImpl::PacketGet(NetPacket &packet)
{
packet.node = -1;
packet.size = 0;
packet.stream.pbStreamEnd = packet.stream.pbStream;
return;
}
}
@ -340,6 +343,7 @@ void DoomComImpl::PacketGet(NetPacket &packet)
packet.node = node;
packet.size = (short)size;
packet.stream.pbStreamEnd = packet.stream.pbStream + packet.size;
return;
}
}