ReadBytes() does not lose data (unless you are performing reads across multiple threads at the same time and corrupting the IOHandler.InputBuffer). You are asking ReadBytes() to return whatever arbitrary bytes are currently available at the time it is being called. However, when AByteCount is -1, ReadBytes() always reads from the socket first, even if there are pending bytes still in the InputBuffer. If there are no new bytes on the socket at that moment, it waits for the IOHandler's ReadTimeout to elapse before then returning whatever is in the InputBuffer. And ReadTimeout is set to infinite by default. So, if there is pending bytes in the InputBuffer, not no new bytes on the socket, ReadBytes() will not return until the next client send. You could check IOHandler.InputBufferIsEmpty() first, and if False then call IOHandler.InputBuffer.ExtractToBytes() directly, otherwise call ReadBytes() instead.