private async void ProcessSocket(Socket socket) { Logger.Write("Connected from: " + socket.RemoteEndPoint); var session = new PacketSession(socket); _lock.DoWriteLock(() => _sessions.Add(session)); Dispatch(new ConnectionPacket { Connected = true }, session); try { while (true) { var packet = await session.Receive(); Dispatch(packet, session); } } catch (Exception e) { Logger.Write(e); } Dispatch(new ConnectionPacket {Connected = false}, session); _lock.DoWriteLock(() => _sessions.Remove(session)); try { socket.Shutdown(SocketShutdown.Both); } catch { } }
public void BroadcastPacket(IPacket packet, PacketSession exceptSession = null) { _lock.DoReadLock(() => { var targetSessions = exceptSession != null ? _sessions.Where(e => e != exceptSession) : _sessions; foreach (var session in targetSessions) session.Send(packet); }); }
public void BroadcastPacket(IPacket packet, PacketSession exceptSession = null) { _listener.BroadcastPacket(packet, exceptSession); }
public GameObject RemovePlayer(PacketSession playerSession) { const int retryCount = 64; var objectId = 0; return Enumerable.Range(0, retryCount).Any(_ => _sessions.TryRemove(playerSession, out objectId)) ? RemoveGameObject(objectId) : null; }
public void AddPlayer(GameObject playerObject, PacketSession playerSession) { AddGameObject(playerObject); const int retryCount = 1024; if (!Enumerable.Range(0, retryCount).Any(_ => _sessions.TryAdd(playerSession, playerObject.ObjectId))) throw new InvalidOperationException(); }
public void Dispatch(IPacket packet, PacketSession peerSession) { var packetType = packet.GetType(); var pair = _handlerMap[packetType]; pair.Value.Invoke(pair.Key, new object[] { packet, peerSession }); }