Network/ENetPacket: Fix acknowledge callback on fragmented packets

This commit is contained in:
SirLynix 2024-02-22 20:12:34 +01:00
parent 62702ec481
commit f71d149785
2 changed files with 31 additions and 21 deletions

View File

@ -38,6 +38,7 @@ namespace Nz
NetPacket data;
std::size_t poolIndex;
std::size_t referenceCount = 0;
UInt32 remainingFragments; // for ack
NazaraSignal(OnAcknowledged);
};

View File

@ -224,6 +224,8 @@ namespace Nz
startSequenceNumber = HostToNet<UInt16>(channel.outgoingReliableSequenceNumber + 1);
}
packetRef->remainingFragments = fragmentCount;
for (UInt32 fragmentNumber = 0, fragmentOffset = 0; fragmentOffset < packetSize; ++fragmentNumber, fragmentOffset += fragmentLength)
{
if (packetSize - fragmentOffset < fragmentLength)
@ -247,29 +249,33 @@ namespace Nz
return true;
}
ENetProtocol command;
command.header.channelID = channelId;
if ((packetRef->flags & (ENetPacketFlag::Reliable | ENetPacketFlag::Unsequenced)) == ENetPacketFlag::Unsequenced)
{
command.header.command = ENetProtocolCommand_SendUnsequenced | ENetProtocolFlag_Unsequenced;
command.sendUnsequenced.dataLength = HostToNet(UInt16(packetRef->data.GetDataSize()));
}
else if (packetRef->flags & ENetPacketFlag::Reliable || channel.outgoingUnreliableSequenceNumber >= 0xFFFF)
{
command.header.command = ENetProtocolCommand_SendReliable | ENetProtocolFlag_Acknowledge;
command.sendReliable.dataLength = HostToNet(UInt16(packetRef->data.GetDataSize()));
}
else
{
command.header.command = ENetProtocolCommand_SendUnreliable;
command.sendUnreliable.dataLength = HostToNet(UInt16(packetRef->data.GetDataSize()));
packetRef->remainingFragments = 1;
ENetProtocol command;
command.header.channelID = channelId;
if ((packetRef->flags & (ENetPacketFlag::Reliable | ENetPacketFlag::Unsequenced)) == ENetPacketFlag::Unsequenced)
{
command.header.command = ENetProtocolCommand_SendUnsequenced | ENetProtocolFlag_Unsequenced;
command.sendUnsequenced.dataLength = HostToNet(UInt16(packetRef->data.GetDataSize()));
}
else if (packetRef->flags & ENetPacketFlag::Reliable || channel.outgoingUnreliableSequenceNumber >= 0xFFFF)
{
command.header.command = ENetProtocolCommand_SendReliable | ENetProtocolFlag_Acknowledge;
command.sendReliable.dataLength = HostToNet(UInt16(packetRef->data.GetDataSize()));
}
else
{
command.header.command = ENetProtocolCommand_SendUnreliable;
command.sendUnreliable.dataLength = HostToNet(UInt16(packetRef->data.GetDataSize()));
}
QueueOutgoingCommand(command, packetRef, 0, UInt16(packetSize));
return true;
}
QueueOutgoingCommand(command, packetRef, 0, UInt16(packetSize));
return true;
}
void ENetPeer::ThrottleConfigure(UInt32 interval, UInt32 acceleration, UInt32 deceleration)
@ -1031,7 +1037,10 @@ namespace Nz
if (currentCommand->packet && wasSent)
{
m_reliableDataInTransit -= currentCommand->fragmentLength;
currentCommand->packet->OnAcknowledged();
assert(currentCommand->packet->remainingFragments > 0);
if (--currentCommand->packet->remainingFragments == 0)
currentCommand->packet->OnAcknowledged();
}
commandList->erase(currentCommand);