private void Receivecallback(IAsyncResult ar) { try { int receivedByte = _client.EndReceive(ar); if (receivedByte == 0) { AsyncOnMessageRecived?.Invoke("Error Handled, Client force disconnected"); Dispose(); } if (!_headerParsed) { _parseResult = PacketParser.HeaderParse(_buffer, (uint)receivedByte); if (_parseResult.HeaderParsed == false) { Process(PacketParser.HeaderSize - receivedByte); } else if (_parseResult.ContentLength == _parseResult.ReceivedContentLength) { byte[] bufferClone = new byte[_buffer.Length]; Buffer.BlockCopy(_buffer, 0, bufferClone, 0, PacketParser.HeaderSize + _parseResult.ContentLength); _headerParsed = false; AsyncOnClientDataRecived?.Invoke(this, bufferClone, _parseResult); Process(PacketParser.HeaderSize); } else { _leftContentByte = _parseResult.ContentLength - _parseResult.ReceivedContentLength; _contentOffSet = PacketParser.HeaderSize + _parseResult.ReceivedContentLength; _contentFullBuffer = new byte[PacketParser.HeaderSize + _parseResult.ContentLength]; Buffer.BlockCopy(_buffer, 0, _contentFullBuffer, 0, receivedByte); _headerParsed = true; Process(_leftContentByte); } } else { Buffer.BlockCopy(_buffer, 0, _contentFullBuffer, _contentOffSet, receivedByte); _leftContentByte -= receivedByte; _contentOffSet += receivedByte; if (_leftContentByte <= 0) { byte[] bufferClone = new byte[_contentFullBuffer.Length]; Buffer.BlockCopy(_contentFullBuffer, 0, bufferClone, 0, PacketParser.HeaderSize + _parseResult.ContentLength); _headerParsed = false; AsyncOnClientDataRecived?.Invoke(this, bufferClone, _parseResult); Process(PacketParser.HeaderSize); } else { Process(_leftContentByte); } } } catch (SocketException e) { AsyncOnErrMessageRecived?.Invoke(e.Message); AsyncOnMessageRecived?.Invoke("Error Handled, Client force disconnected"); Dispose(); } catch (ObjectDisposedException e) { AsyncOnErrMessageRecived?.Invoke(e.Message); AsyncOnMessageRecived?.Invoke("Error Handled, Client force disconnected"); Dispose(); } }