//---- Read Messages //------------------ protected void ReceiveCallback(IAsyncResult result) { try { int byteLength = stream.EndRead(result); if (byteLength <= 0) { Status = SharedEnums.ConnectionStatus.Disconnect; return; } // create network packet for incoming messages if (packet == null) { packet = new NetworkPacket(); } byte[] data = new byte[byteLength]; Array.Copy(readBuffer, data, byteLength); // read packet packet.AppendBytes(data); while (!packet.BytesNullOrEmpty) { NetworkPacket.ProcessResult process = packet.Read(); if (process == NetworkPacket.ProcessResult.Error) { Status = SharedEnums.ConnectionStatus.Disconnect; return; } if (process == NetworkPacket.ProcessResult.NotDone) { // Packet was broken up, need another packet to finish so wait to read more break; } else if (process == NetworkPacket.ProcessResult.Done) { // Network message done, process ProcessNetMessage(packet.Interface, packet.Type, packet.Message); packet.ResetForNewMessage(); // will continue to read until all messages are read from bytes. } } // start reading again stream.BeginRead(readBuffer, 0, SharedConsts.DATABUFFERSIZE, ReceiveCallback, null); } catch (Exception ex) { Log?.Error($"Error receiving message: {ex}"); // disconnect Status = SharedEnums.ConnectionStatus.Disconnect; } }