public override MLAPI.Transports.NetEventType PollEvent(out ulong clientId, out string channelName, out ArraySegment <byte> payload) { NetworkEventType eventType = RelayTransport.Receive(out int hostId, out int connectionId, out int channelId, messageBuffer, messageBuffer.Length, out int receivedSize, out byte error); clientId = GetMLAPIClientId((byte)hostId, (ushort)connectionId, false); NetworkError networkError = (NetworkError)error; if (networkError == NetworkError.MessageToLong) { byte[] tempBuffer; if (temporaryBufferReference != null && temporaryBufferReference.IsAlive && ((byte[])temporaryBufferReference.Target).Length >= receivedSize) { tempBuffer = (byte[])temporaryBufferReference.Target; } else { tempBuffer = new byte[receivedSize]; temporaryBufferReference = new WeakReference(tempBuffer); } eventType = RelayTransport.Receive(out hostId, out connectionId, out channelId, tempBuffer, tempBuffer.Length, out receivedSize, out error); payload = new ArraySegment <byte>(tempBuffer, 0, receivedSize); } else { payload = new ArraySegment <byte>(messageBuffer, 0, receivedSize); } channelName = channelIdToName[channelId]; if (networkError == NetworkError.Timeout) { // In UNET. Timeouts are not disconnects. We have to translate that here. eventType = NetworkEventType.DisconnectEvent; } // Translate NetworkEventType to NetEventType switch (eventType) { case NetworkEventType.DataEvent: return(MLAPI.Transports.NetEventType.Data); case NetworkEventType.ConnectEvent: return(MLAPI.Transports.NetEventType.Connect); case NetworkEventType.DisconnectEvent: return(MLAPI.Transports.NetEventType.Disconnect); case NetworkEventType.Nothing: return(MLAPI.Transports.NetEventType.Nothing); case NetworkEventType.BroadcastEvent: return(MLAPI.Transports.NetEventType.Nothing); } return(MLAPI.Transports.NetEventType.Nothing); }
public override void Send(ulong clientId, ArraySegment <byte> data, string channelName, bool skipQueue) { GetUnetConnectionDetails(clientId, out byte hostId, out ushort connectionId); int channelId = channelNameToId[channelName]; byte[] buffer; if (data.Offset > 0) { // UNET cant handle this, do a copy if (messageBuffer.Length >= data.Count) { buffer = messageBuffer; } else { if (temporaryBufferReference != null && temporaryBufferReference.IsAlive && ((byte[])temporaryBufferReference.Target).Length >= data.Count) { buffer = (byte[])temporaryBufferReference.Target; } else { buffer = new byte[data.Count]; temporaryBufferReference = new WeakReference(buffer); } } Buffer.BlockCopy(data.Array, data.Offset, buffer, 0, data.Count); } else { buffer = data.Array; } if (skipQueue) { RelayTransport.Send(hostId, connectionId, channelId, buffer, data.Count, out byte error); } else { RelayTransport.QueueMessageForSending(hostId, connectionId, channelId, buffer, data.Count, out byte error); } }
public override void StartServer() { HostTopology topology = new HostTopology(GetConfig(), MaxConnections); if (SupportWebsocket) { if (!UseMLAPIRelay) { int websocketHostId = NetworkTransport.AddWebsocketHost(topology, ServerWebsocketListenPort); } else { if (LogHelper.CurrentLogLevel <= LogLevel.Error) { LogHelper.LogError("Cannot create websocket host when using MLAPI relay"); } } } int normalHostId = RelayTransport.AddHost(topology, ServerListenPort, true); }
public override void FlushSendQueue(ulong clientId) { GetUnetConnectionDetails(clientId, out byte hostId, out ushort connectionId); RelayTransport.SendQueuedMessages(hostId, connectionId, out byte error); }
public override void DisconnectLocalClient() { RelayTransport.Disconnect(serverHostId, serverConnectionId, out byte error); }
public override void DisconnectRemoteClient(ulong clientId) { GetUnetConnectionDetails(clientId, out byte hostId, out ushort connectionId); RelayTransport.Disconnect((int)hostId, (int)connectionId, out byte error); }
public override void StartClient() { serverHostId = RelayTransport.AddHost(new HostTopology(GetConfig(), 1), false); serverConnectionId = RelayTransport.Connect(serverHostId, ConnectAddress, ConnectPort, 0, out byte error); }