Completely rework the network stack for faster lower latency messages

This commit is contained in:
derek committed 2026-07-03 15:00:01 -07:00
1 parent a689f2656f
commit ca39e184ed
7 files changed
+133 -129

No files matched your search

+29 -11
View File
@@ -19,21 +19,39 @@ namespace Mistox.Server {
receiveThread.Start();
}
public async Task ReceiveThread() {
while( _client.Connected && _connection.Connected && ServerInterface.ServerInstance.Alive ) {
async Task ReceiveThread() {
using( NetworkStream ns = _client.GetStream() ) {
try {
_connection.LastHeartbeat = DateTime.UtcNow;
byte[] StreamData = new byte[1024];
int bytesRead = await _client.GetStream().ReadAsync(StreamData, 0, StreamData.Length);
if( bytesRead > 0 ) {
dynamic data = Serializer.tReceive( StreamData.Sub( 0, bytesRead ) );
if( data != null ) {
ServerInterface.ServerInstance.InvokeDataReceived( data );
byte[] headerBuffer = new byte[DataPacket.HeaderLength];
byte[] payloadBuffer = new byte[65535]; // Upper limit for safety
while( _connection.Connected ) {
// Read the header off
await ns.ReadExactlyAsync(headerBuffer, 0, 3);
// Parse the header
byte packetbyte = headerBuffer[0];
ushort dataLength = (ushort)((headerBuffer[1] << 8) | headerBuffer[2]);
// Make sure the data looks valid
if (dataLength > payloadBuffer.Length) {
throw new Exception("Incoming TCP payload is too large for the pre-allocated buffer.");
}
// Read off the data
await ns.ReadExactlyAsync(payloadBuffer, 0, dataLength);
// Create the dataobject
dynamic dataobject = DataPacket.Deserialize( packetbyte, dataLength, payloadBuffer.AsMemory(DataPacket.HeaderLength, dataLength) );
// Return the object
ServerInterface.ServerInstance.InvokeDataReceived(dataobject);
}
} catch( Exception ) {
Console.WriteLine( "User disconnected" );
} catch (Exception e) {
ClientInterface.ServerClientInstance.Alive = false;
Dispose();
Console.WriteLine("TCP Receive exception: " + e.Message);
}
}
}