async Task ReceiveBroadcastAsync() { UdpReceiveResult udpReceiveResult = await m_Client.ReceiveAsync(); var segment = new ArraySegment <byte>(udpReceiveResult.Buffer, 0, udpReceiveResult.Buffer.Length); using var reader = new FastBufferReader(segment, Allocator.Temp); try { if (ReadAndCheckHeader(reader, MessageType.BroadCast) == false) { return; } reader.ReadNetworkSerializable(out TBroadCast receivedBroadcast); if (ProcessBroadcast(udpReceiveResult.RemoteEndPoint, receivedBroadcast, out TResponse response)) { using var writer = new FastBufferWriter(1024, Allocator.Temp, 1024 * 64); WriteHeader(writer, MessageType.Response); writer.WriteNetworkSerializable(response); var data = writer.ToArray(); await m_Client.SendAsync(data, data.Length, udpReceiveResult.RemoteEndPoint); } } catch (Exception e) { Debug.LogException(e); } }
protected override FastBufferReader Buf(params byte[] bytes) { _buffer = new byte[bytes.Length + 10]; Array.Copy(bytes, _buffer, bytes.Length); var rdr = new FastBufferReader(_buffer); rdr.SetView(bytes.Length); return(rdr); }
public void SetRestoreViewWorks() { const ulong value = 43543543UL; var rdr = new FastBufferReader(BitConverter.GetBytes(value).Concat(BitConverter.GetBytes(value)).ToArray()); var view = rdr.SetView(8); var subView = rdr.SetView(0); Assert.True(rdr.End); rdr.RestoreView(subView); Assert.Equal(value, rdr.ReadLittleEndian64()); rdr.RestoreView(view); Assert.Equal(value, rdr.ReadLittleEndian64()); Assert.Throws <InvalidOperationException>(() => rdr.RestoreView(subView)); }
private bool ReadAndCheckHeader(FastBufferReader reader, MessageType expectedType) { reader.ReadValueSafe(out long receivedApplicationId); if (receivedApplicationId != m_UniqueApplicationId) { return(false); } reader.ReadByteSafe(out byte messageType); if (messageType != (byte)expectedType) { return(false); } return(true); }
async Task ReceiveResponseAsync() { UdpReceiveResult udpReceiveResult = await m_Client.ReceiveAsync(); var segment = new ArraySegment <byte>(udpReceiveResult.Buffer, 0, udpReceiveResult.Buffer.Length); using var reader = new FastBufferReader(segment, Allocator.Temp); try { if (ReadAndCheckHeader(reader, MessageType.Response) == false) { return; } reader.ReadNetworkSerializable(out TResponse receivedResponse); ResponseReceived(udpReceiveResult.RemoteEndPoint, receivedResponse); } catch (Exception e) { Debug.LogException(e); } }