private void StartReceive() { SocketAsyncEventArgs args = SocketPool.Get(); args.Completed += OperationCompleted; if (!Connection.ReceiveAsync(args)) { OperationCompleted(this, args); } }
private void ProcessNetwork(SocketAsyncEventArgs e) { if (Connection == null || !Connection.Connected) { return; } if (e.SocketError == SocketError.Success && e.BytesTransferred > 0) { SocketAsyncEventArgs newArgs = SocketPool.Get(); newArgs.Completed += OperationCompleted; if (!Connection.ReceiveAsync(newArgs)) { OperationCompleted(this, newArgs); } try { sem.Wait(500, cancel.Token); } catch (OperationCanceledException) { } catch (NullReferenceException) { } catch (TimeoutException) { Server.DisconnectClient(this); return; } var packets = PacketReader.ReadPackets(this, e.Buffer, e.Offset, e.BytesTransferred); try { foreach (IPacket packet in packets) { if (PacketHandlers[packet.ID] != null) { try { PacketHandlers[packet.ID](packet, this, Server); } catch (PlayerDisconnectException) { Server.DisconnectClient(this); } catch (Exception ex) { Server.Log(LogCategory.Debug, "Disconnecting client due to exception in network worker"); Server.Log(LogCategory.Debug, ex.ToString()); Server.DisconnectClient(this); } } else { Log("Unhandled packet {0}", packet.GetType().Name); } } } catch (NotSupportedException) { Server.Log(LogCategory.Debug, "Disconnecting client due to unsupported packet received."); return; } if (sem != null) { sem.Release(); } } else { Server.DisconnectClient(this); } }