public Send ( |
||
Segment | ||
return |
void Flush(bool disposing) { if (_remainingSpaceInOutputSegment == 0) { _socket.Flush(); } else if (_remainingSpaceInOutputSegment == _outputSegmentTotalLength) { if (disposing) { _currentOutputSegment.Dispose(); } } else { unsafe { _currentOutputSegment.SegmentPointer->Length = _outputSegmentTotalLength - _remainingSpaceInOutputSegment; } _socket.Send(_currentOutputSegment, RIO_SEND_FLAGS.NONE); _currentOutputSegment.Dispose(); if (disposing) { _remainingSpaceInOutputSegment = 0; _outputSegmentTotalLength = 0; } else { _currentOutputSegment = _socket.SendBufferPool.GetBuffer(); _outputSegmentTotalLength = _currentOutputSegment.TotalLength; _remainingSpaceInOutputSegment = _outputSegmentTotalLength; } } }
static async Task ServeFixed(RioSocket socket) { try { var buffer = new byte[128 * pipeLineDeph]; var leftoverLength = 0; var oldleftoverLength = 0; uint endOfRequest = 0x0a0d0a0d; uint current = 0; var stream = new RioStream(socket); while (true) { int r = await stream.ReadAsync(buffer, 0, buffer.Length); if (r == 0) break; for (int i = 0; leftoverLength != 0 && i < 4 - leftoverLength; i++) { current += buffer[i]; current = current << 8; if (current == endOfRequest) socket.Send(currentSegment); } leftoverLength = r % 4; var length = r - leftoverLength; unsafe { fixed (byte* currentPtr = &buffer[oldleftoverLength]) { var start = currentPtr; var end = currentPtr + length; for (; start <= end; start++) { if (*(uint*)start == endOfRequest) socket.Send(currentSegment); } } } oldleftoverLength = leftoverLength; for (int i = r - leftoverLength; i < r; i++) { current += buffer[i]; current = current << 4; } stream.Flush(); } } catch (Exception ex) { Console.WriteLine(ex); } finally { socket.Dispose(); } }