1
0
Fork 0
mirror of https://github.com/besterprotocol/bformat synced 2023-12-13 21:30:24 +01:00

Full wait doesn't work

This commit is contained in:
Tristan B. Kildaire 2020-12-04 18:55:25 +02:00
parent 8e5647347d
commit a236409034

View file

@ -7,9 +7,36 @@ public bool receiveMessage(Socket originator, ref byte[] receiveMessage)
/* Construct a buffer to receive into */ /* Construct a buffer to receive into */
byte[] receiveBuffer; byte[] receiveBuffer;
/* Read 4 bytes of length */ /* The current byte */
receiveBuffer.length = 4; uint currentByte = 0;
originator.receive(receiveBuffer, cast(SocketFlags)MSG_WAITALL);
/* The amount of bytes received */
long bytesReceived;
/* Loop consume the next 4 bytes */
while(currentByte < 4)
{
/* Temporary buffer */
byte[4] tempBuffer;
/* Read at-most 4 bytes */
bytesReceived = originator.receive(tempBuffer);
/* If there was an error reading from the socket */
if(!(bytesReceived > 0))
{
return false;
}
/* If there is no error reading from the socket */
else
{
/* Add the read bytes to the *real* buffer */
receiveBuffer ~= tempBuffer[0..bytesReceived];
/* Increment the byte counter */
currentByte += bytesReceived;
}
}
/* Response message length */ /* Response message length */
int messageLength; int messageLength;
@ -37,10 +64,60 @@ public bool receiveMessage(Socket originator, ref byte[] receiveMessage)
/* Reset buffer */ /* Reset buffer */
receiveBuffer.length = cast(uint)messageLength; receiveBuffer.length = cast(uint)messageLength;
/* Read the full message */ /* Reset the byte counter */
originator.receive(receiveBuffer, cast(SocketFlags)MSG_WAITALL); currentByte = 0;
// writeln("Message ", fullMessage); while(currentByte < messageLength)
{
/**
* Receive 20 bytes (at most) at a time and don't dequeue from
* the kernel's TCP stack's buffer.
*/
byte[20] tempBuffer;
bytesReceived = originator.receive(tempBuffer, SocketFlags.PEEK);
/* Check for an error whilst receiving */
if(!(bytesReceived > 0))
{
return false;
}
else
{
if(cast(uint)bytesReceived+currentByte > messageLength)
{
byte[] remainingBytes;
remainingBytes.length = messageLength-currentByte;
/* Receive the remaining bytes */
originator.receive(remainingBytes);
/* Increment counter of received bytes */
currentByte += remainingBytes.length;
/* Append the received bytes to the FULL message buffer */
fullMessage ~= remainingBytes;
// writeln("Received ", currentByte, "/", cast(uint)messageLength, " bytes");
}
else
{
/* Increment counter of received bytes */
currentByte += bytesReceived;
/* Append the received bytes to the FULL message buffer */
fullMessage ~= tempBuffer[0..bytesReceived];
/* TODO: Bug when over send, we must not allow this */
// writeln("Received ", currentByte, "/", cast(uint)messageLength, " bytes");
/* Dequeue the received bytes */
originator.receive(tempBuffer);
}
}
}
/* Set the message in `receiveMessage */
receiveMessage = fullMessage;
return true; return true;
} }