public void Send(PacketWriter packet) { if (packet.Opcode == 0) { return; } var buffer = packet.ReadDataToSend(); if (Crypt.IsInitialized) { uint totalLength = (uint)packet.Size - 2; totalLength <<= 12; totalLength |= ((uint)packet.Opcode & 0xFFF); var header = BitConverter.GetBytes(totalLength); Crypt.Encrypt(header); buffer[0] = header[0]; buffer[1] = header[1]; buffer[2] = header[2]; buffer[3] = header[3]; } var args = SocketAsyncEventArgsPool.Acquire(); args.SetBuffer(buffer, 0, buffer.Length); args.Completed += OnSend; try { if (!clientSocket.SendAsync(args)) { OnSend(this, args); } } catch (Exception ex) { args.Completed -= OnSend; SocketAsyncEventArgsPool.Release(args); Disconnect(); if (ex is ObjectDisposedException) { return; } if (ex is SocketException) { Log.outException(ex); return; } throw; } Log.outDebug("Sent Opcode: 0x{0:X} ({0}) to Player: {1}", packet.Opcode, GetAccount() == null ? 0 : GetAccountId()); PacketLog.WritePacket(clientSocket.RemoteEndPoint.ToString(), packet); }
private void Accept(SocketAsyncEventArgs args) { if (args == null) { args = SocketAsyncEventArgsPool.Acquire(); args.Completed += OnAccept; } else { args.AcceptSocket = null; } try { if (!Listener.AcceptAsync(args)) { OnAccept(this, args); } } catch (Exception ex) { args.Completed -= OnAccept; SocketAsyncEventArgsPool.Release(args); if (ex is ObjectDisposedException) { return; } if (ex is SocketException) { Log.outException(ex); return; } throw; } }
private void OnSend(object sender, SocketAsyncEventArgs args) { args.Completed -= OnSend; SocketAsyncEventArgsPool.Release(args); }