public async ValueTask <NetSendState> FlushSendBuffer() { if (!Socket.Connected) { return(NetSendState.Closed); } var sendBuffer = SendBuffer; int length = (int)sendBuffer.Length; if (length > 0) { int left = length; int block = 0; while (left > 0) { var buffer = sendBuffer.GetBlock(block); int blockLength = Math.Min(sendBuffer.BlockSize, left); var data = buffer.Slice(0, blockLength); int write = await Socket.SendAsync(data, SocketFlags.None).ConfigureAwait(false); if (write == 0) { Close(immediate: false); return(NetSendState.Closing); } BytesSent += write; left -= write; block++; } SendBuffer.TrimStart(length); } return(NetSendState.FullSend); }