mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-03-02 15:42:17 +00:00
changed the packet parsing so that one packet can contain more than one command
This commit is contained in:
parent
a07f8feb75
commit
f3a509ac2d
5 changed files with 52 additions and 21 deletions
|
@ -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();
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -80,6 +80,8 @@ struct BYTESTREAM_s
|
|||
|
||||
void WriteHeader( int Byte );
|
||||
|
||||
bool IsAtEnd() const;
|
||||
|
||||
// Pointer to our stream of data.
|
||||
uint8_t *pbStream;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue