/// <summary> /// Sends discovery request from client /// </summary> public void BroadcastDiscoveryRequest() { if (clientUdpClient == null) { return; } if (NetworkClient.isConnected) { StopDiscovery(); return; } IPEndPoint endPoint = new IPEndPoint(IPAddress.Broadcast, serverBroadcastListenPort); using (NetworkWriterPooled writer = NetworkWriterPool.Get()) { writer.WriteLong(secretHandshake); try { Request request = GetRequest(); writer.Write(request); ArraySegment <byte> data = writer.ToArraySegment(); clientUdpClient.SendAsync(data.Array, data.Count, endPoint); } catch (Exception) { // It is ok if we can't broadcast to one of the addresses } } }
/// <summary> /// Reply to the client to inform it of this server /// </summary> /// <remarks> /// Override if you wish to ignore server requests based on /// custom criteria such as language, full server game mode or difficulty /// </remarks> /// <param name="request">Request coming from client</param> /// <param name="endpoint">Address of the client that sent the request</param> protected virtual void ProcessClientRequest(Request request, IPEndPoint endpoint) { Response info = ProcessRequest(request, endpoint); if (info == null) { return; } using (NetworkWriterPooled writer = NetworkWriterPool.Get()) { try { writer.WriteLong(secretHandshake); writer.Write(info); ArraySegment <byte> data = writer.ToArraySegment(); // signature matches // send response serverUdpClient.Send(data.Array, data.Count, endpoint); } catch (Exception ex) { Debug.LogException(ex, this); } } }
// helper function to pack message into a simple byte[] public static byte[] PackToByteArray <T>(T message) where T : struct, NetworkMessage { using (NetworkWriterPooled writer = NetworkWriterPool.Get()) { MessagePacking.Pack(message, writer); return(writer.ToArray()); } }
public static uint GetChangeCount(this SyncObject syncObject) { using (NetworkWriterPooled writer = NetworkWriterPool.Get()) { syncObject.OnSerializeDelta(writer); using (NetworkReaderPooled reader = NetworkReaderPool.Get(writer.ToArraySegment())) { return(reader.ReadUInt()); } } }
static void SyncNetworkBehaviour(NetworkBehaviour source, NetworkBehaviour target, bool initialState) { using (NetworkWriterPooled writer = NetworkWriterPool.Get()) { source.OnSerialize(writer, initialState); using (NetworkReaderPooled reader = NetworkReaderPool.Get(writer.ToArraySegment())) { target.OnDeserialize(reader, initialState); } } }