using System.IO; using System.Threading.Tasks; namespace Passer.Control { public static class SiteServer { public static async Task ReceiveData(Stream dataStream, Client client) { while (true) { byte packetSize = (byte)dataStream.ReadByte(); if (packetSize != 0xFF) await ReceiveData(dataStream, client, packetSize); // else timeout } } public static async Task ReceiveData(Stream dataStream, Client client, byte packetSize) { byte msgId = (byte)dataStream.ReadByte(); if (msgId == 0xFF) { // Timeout return; } //UnityEngine.Debug.Log($"R {msgId} from {client.ipAddress}"); bool result = false; switch (msgId) { case ClientMsg.Id: // 0xA0 / 160 result = await ClientMsg.Receive(dataStream, client, packetSize); break; case NetworkIdMsg.Id: // 0xA1 / 161 result = await NetworkIdMsg.Receive(dataStream, client, packetSize); break; case InvestigateMsg.Id: // 0x81 result = await InvestigateMsg.Receive(dataStream, client, packetSize); break; case ThingMsg.Id: // 0x80 / 128 result = await ThingMsg.Receive(dataStream, client, packetSize); break; case NameMsg.Id: // 0x91 / 145 result = await NameMsg.Receive(dataStream, client, packetSize); break; case ModelUrlMsg.Id: // 0x90 / 144 result = await ModelUrlMsg.Receive(dataStream, client, packetSize); break; case PoseMsg.Id: // 0x10 / 16 result = await PoseMsg.Receive(dataStream, client, packetSize); break; case CustomMsg.Id: // 0xB1 / 177 result = await CustomMsg.Receive(dataStream, client, packetSize); break; case TextMsg.Id: // 0xB0 / 176 result = await TextMsg.Receive(dataStream, client, packetSize); break; case DestroyMsg.Id: // 0x20 / 32 result = await DestroyMsg.Receive(dataStream, client, packetSize); break; default: break; } if (result == false) { packetSize = msgId; // skip 1 byte, msgId is possibly a packet size byte await ReceiveData(dataStream, client, packetSize); } } } }