public void ClientBroadcast(TBroadCast broadCast) { if (!IsClient) { throw new InvalidOperationException("Cannot send client broadcast while not running in client mode. Call StartClient first."); } IPEndPoint endPoint = new IPEndPoint(IPAddress.Broadcast, m_Port); using (FastBufferWriter writer = new FastBufferWriter(1024, Allocator.Temp, 1024 * 64)) { WriteHeader(writer, MessageType.BroadCast); writer.WriteNetworkSerializable(broadCast); var data = writer.ToArray(); try { // This works because PooledBitStream.Get resets the position to 0 so the array segment will always start from 0. m_Client.SendAsync(data, data.Length, endPoint); } catch (Exception e) { Debug.LogError(e); } } }
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); } }