private void Send(byte[] data, int length, bool skip_encryption) { if (_tcpClient == null || IsDisposed) { return; } if (_netStream == null || !_tcpClient.Connected) { return; } if (data != null && data.Length != 0 && length > 0) { if (CUOEnviroment.PacketLog) { LogPacket(data, length, true); } if (!skip_encryption) { EncryptionHelper.Encrypt(_is_login_socket, ref data, ref data, length); } try { _netStream.Write(data, 0, length); _netStream.Flush(); Statistics.TotalBytesSent += (uint)length; Statistics.TotalPacketsSent++; } catch (SocketException ex) { Log.Error("socket error when sending:\n" + ex); _logFile?.Write($"disconnection - error during writing to the socket buffer: {ex}"); Disconnect(ex.SocketErrorCode); } catch (Exception ex) { if (ex.InnerException is SocketException socketEx) { Log.Error("socket error when sending:\n" + socketEx); _logFile?.Write($"disconnection - error during writing to the socket buffer [2]: {socketEx}"); Disconnect(socketEx.SocketErrorCode); } else { Log.Error("fatal error when receiving:\n" + ex); _logFile?.Write($"disconnection - error during writing to the socket buffer [3]: {ex}"); Disconnect(); throw; } } } }
private void ProcessRecv() { if (IsDisposed || Status != ClientSocketStatus.Connected) { return; } if (!IsConnected && !IsDisposed) { Disconnect(); return; } if (!_netStream.DataAvailable) { return; } int available = _tcpClient.Available; if (available <= 0) { return; } try { int received = _netStream.Read(_recvBuffer, 0, available); if (received > 0) { Statistics.TotalBytesReceived += (uint)received; byte[] buffer = _recvBuffer; if (!_is_login_socket) { EncryptionHelper.Decrypt(ref buffer, ref buffer, received); } if (_isCompressionEnabled) { DecompressBuffer(ref buffer, ref received); } lock (_circularBuffer) { _circularBuffer.Enqueue(buffer, 0, received); } ExtractPackets(); } else { Log.Warn("Server sent 0 bytes. Closing connection"); _logFile?.Write($"disconnection - received {received} bytes from server"); Disconnect(SocketError.SocketError); } } catch (SocketException socketException) { Log.Error("socket error when receiving:\n" + socketException); _logFile?.Write($"disconnection - error while reading from socket: {socketException}"); Disconnect(socketException.SocketErrorCode); } catch (Exception ex) { if (ex.InnerException is SocketException socketEx) { Log.Error("socket error when receiving:\n" + socketEx); _logFile?.Write($"disconnection - error while reading from socket [1]: {socketEx}"); Disconnect(socketEx.SocketErrorCode); } else { Log.Error("fatal error when receiving:\n" + ex); _logFile?.Write($"disconnection - error while reading from socket [2]: {ex}"); Disconnect(); throw; } } }
private void ProcessRecv() { if (IsDisposed || Status != ClientSocketStatus.Connected) { return; } if (!IsConnected && !IsDisposed) { Disconnect(); return; } int available = _socket.Available; if (available <= 0) { return; } const int SIZE_TO_READ = 4096; byte[] buffer = System.Buffers.ArrayPool <byte> .Shared.Rent(SIZE_TO_READ * 4 + 2); while (available > 0) { try { int wanted = Math.Min(SIZE_TO_READ, available); int received = _socket.Receive(buffer, 0, wanted, SocketFlags.None, out var errorCode); if (received > 0 && errorCode == SocketError.Success) { available -= received; Statistics.TotalBytesReceived += (uint)received; if (!_is_login_socket) { EncryptionHelper.Decrypt(buffer, buffer, received); } if (_isCompressionEnabled) { DecompressBuffer(buffer, ref received); } _circularBuffer.Enqueue(buffer.AsSpan(0, received)); ExtractPackets(); } else { Log.Warn("Server sent 0 bytes. Closing connection"); _logFile?.Write($"disconnection - received {received} bytes from server. ErrorCode: {errorCode}"); Disconnect(SocketError.SocketError); break; } } catch (SocketException socketException) { Log.Error("socket error when receiving:\n" + socketException); _logFile?.Write($"disconnection - error while reading from socket: {socketException}"); Disconnect(socketException.SocketErrorCode); break; } catch (Exception ex) { if (ex.InnerException is SocketException socketEx) { Log.Error("socket error when receiving:\n" + socketEx); _logFile?.Write($"disconnection - error while reading from socket [1]: {socketEx}"); Disconnect(socketEx.SocketErrorCode); break; } else { Log.Error("fatal error when receiving:\n" + ex); _logFile?.Write($"disconnection - error while reading from socket [2]: {ex}"); Disconnect(); throw; } } } System.Buffers.ArrayPool <byte> .Shared.Return(buffer, false); // TODO: clear? }