Cleanup, simple perf.
This commit is contained in:
parent
9ba9f666bb
commit
30ca12933e
|
|
@ -154,15 +154,8 @@ namespace Microsoft.Net.WebSockets
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle fragmentation, remember the first frame type
|
// Handle fragmentation, remember the first frame type
|
||||||
int opCode = Constants.OpCodes.ContinuationFrame;
|
int opCode = _frameInProgress.OpCode;
|
||||||
if (_frameInProgress.OpCode == Constants.OpCodes.BinaryFrame
|
if (opCode == Constants.OpCodes.ContinuationFrame)
|
||||||
|| _frameInProgress.OpCode == Constants.OpCodes.TextFrame
|
|
||||||
|| _frameInProgress.OpCode == Constants.OpCodes.CloseFrame)
|
|
||||||
{
|
|
||||||
opCode = _frameInProgress.OpCode;
|
|
||||||
_firstDataOpCode = opCode;
|
|
||||||
}
|
|
||||||
else if (_frameInProgress.OpCode == Constants.OpCodes.ContinuationFrame)
|
|
||||||
{
|
{
|
||||||
if (!_firstDataOpCode.HasValue)
|
if (!_firstDataOpCode.HasValue)
|
||||||
{
|
{
|
||||||
|
|
@ -170,39 +163,34 @@ namespace Microsoft.Net.WebSockets
|
||||||
}
|
}
|
||||||
opCode = _firstDataOpCode.Value;
|
opCode = _firstDataOpCode.Value;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_firstDataOpCode = opCode;
|
||||||
|
}
|
||||||
|
|
||||||
if (opCode == Constants.OpCodes.CloseFrame)
|
if (opCode == Constants.OpCodes.CloseFrame)
|
||||||
{
|
{
|
||||||
return await ProcessCloseFrameAsync(cancellationToken);
|
return await ProcessCloseFrameAsync(cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
WebSocketReceiveResult result;
|
|
||||||
|
|
||||||
WebSocketMessageType messageType = Utilities.GetMessageType(opCode);
|
|
||||||
if (_frameBytesRemaining == 0)
|
|
||||||
{
|
|
||||||
// End of an empty frame?
|
|
||||||
result = new WebSocketReceiveResult(0, messageType, _frameInProgress.Fin);
|
|
||||||
if (_frameInProgress.Fin)
|
|
||||||
{
|
|
||||||
_firstDataOpCode = null;
|
|
||||||
}
|
|
||||||
_frameInProgress = null;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure there's at least some data in the buffer
|
// Make sure there's at least some data in the buffer
|
||||||
await EnsureDataAvailableOrReadAsync(1, cancellationToken);
|
int bytesToBuffer = (int)Math.Min((long)_receiveBuffer.Length, _frameBytesRemaining);
|
||||||
|
await EnsureDataAvailableOrReadAsync(bytesToBuffer, cancellationToken);
|
||||||
|
|
||||||
// Copy buffered data to the users buffer
|
// Copy buffered data to the users buffer
|
||||||
int bytesToRead = (int)Math.Min((long)buffer.Count, _frameBytesRemaining);
|
int bytesToRead = (int)Math.Min((long)buffer.Count, _frameBytesRemaining);
|
||||||
int bytesToCopy = Math.Min(bytesToRead, _receiveBufferBytes);
|
int bytesToCopy = Math.Min(bytesToRead, _receiveBufferBytes);
|
||||||
Array.Copy(_receiveBuffer, _receiveBufferOffset, buffer.Array, buffer.Offset, bytesToCopy);
|
Array.Copy(_receiveBuffer, _receiveBufferOffset, buffer.Array, buffer.Offset, bytesToCopy);
|
||||||
|
|
||||||
if (_unmaskInput)
|
if (_unmaskInput)
|
||||||
{
|
{
|
||||||
// TODO: mask alignment may be off between reads.
|
// TODO: mask alignment may be off between reads.
|
||||||
// _frameInProgress.Masked == _unmaskInput already verified
|
// _frameInProgress.Masked == _unmaskInput already verified
|
||||||
Utilities.MaskInPlace(_frameInProgress.MaskKey, new ArraySegment<byte>(buffer.Array, buffer.Offset, bytesToCopy));
|
Utilities.MaskInPlace(_frameInProgress.MaskKey, new ArraySegment<byte>(buffer.Array, buffer.Offset, bytesToCopy));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WebSocketReceiveResult result;
|
||||||
|
WebSocketMessageType messageType = Utilities.GetMessageType(opCode);
|
||||||
if (bytesToCopy == _frameBytesRemaining)
|
if (bytesToCopy == _frameBytesRemaining)
|
||||||
{
|
{
|
||||||
result = new WebSocketReceiveResult(bytesToCopy, messageType, _frameInProgress.Fin);
|
result = new WebSocketReceiveResult(bytesToCopy, messageType, _frameInProgress.Fin);
|
||||||
|
|
@ -216,6 +204,7 @@ namespace Microsoft.Net.WebSockets
|
||||||
{
|
{
|
||||||
result = new WebSocketReceiveResult(bytesToCopy, messageType, false);
|
result = new WebSocketReceiveResult(bytesToCopy, messageType, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
_frameBytesRemaining -= bytesToCopy;
|
_frameBytesRemaining -= bytesToCopy;
|
||||||
_receiveBufferBytes -= bytesToCopy;
|
_receiveBufferBytes -= bytesToCopy;
|
||||||
_receiveBufferOffset += bytesToCopy;
|
_receiveBufferOffset += bytesToCopy;
|
||||||
|
|
@ -370,7 +359,7 @@ namespace Microsoft.Net.WebSockets
|
||||||
if (State == WebSocketState.CloseSent)
|
if (State == WebSocketState.CloseSent)
|
||||||
{
|
{
|
||||||
// Do a receiving drain
|
// Do a receiving drain
|
||||||
byte[] data = new byte[1024];
|
byte[] data = new byte[_receiveBuffer.Length];
|
||||||
WebSocketReceiveResult result;
|
WebSocketReceiveResult result;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -33,10 +33,11 @@ namespace Microsoft.Net.WebSockets
|
||||||
};
|
};
|
||||||
int maskOffset = 0;
|
int maskOffset = 0;
|
||||||
|
|
||||||
for (int i = data.Offset; i < data.Offset + data.Count; i++)
|
int end = data.Offset + data.Count;
|
||||||
|
for (int i = data.Offset; i < end; i++)
|
||||||
{
|
{
|
||||||
data.Array[i] = (byte)(data.Array[i] ^ maskBytes[maskOffset]);
|
data.Array[i] ^= maskBytes[maskOffset];
|
||||||
maskOffset = (maskOffset + 1) % 4;
|
maskOffset = (maskOffset + 1) & 0x3; // fast % 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ namespace Microsoft.Net.WebSockets.Client
|
||||||
|
|
||||||
public WebSocketClient()
|
public WebSocketClient()
|
||||||
{
|
{
|
||||||
ReceiveBufferSize = 1024;
|
ReceiveBufferSize = 1024 * 64;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int ReceiveBufferSize
|
public int ReceiveBufferSize
|
||||||
|
|
|
||||||
|
|
@ -22,13 +22,23 @@ namespace TestClient
|
||||||
{
|
{
|
||||||
WebSocketClient client = new WebSocketClient();
|
WebSocketClient client = new WebSocketClient();
|
||||||
WebSocket socket = await client.ConnectAsync(new Uri("ws://chrross-togo:12345/"), CancellationToken.None);
|
WebSocket socket = await client.ConnectAsync(new Uri("ws://chrross-togo:12345/"), CancellationToken.None);
|
||||||
byte[] data = Encoding.UTF8.GetBytes("Hello World");
|
byte[] data = Encoding.UTF8.GetBytes(
|
||||||
|
// TODO: Hangs after 10 seconds
|
||||||
|
// "Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World"
|
||||||
|
// "Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, "
|
||||||
|
// "Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, "
|
||||||
|
"Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, "
|
||||||
|
);
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
await socket.SendAsync(new ArraySegment<byte>(data), WebSocketMessageType.Text, true, CancellationToken.None);
|
await socket.SendAsync(new ArraySegment<byte>(data), WebSocketMessageType.Text, true, CancellationToken.None);
|
||||||
WebSocketReceiveResult result = await socket.ReceiveAsync(new ArraySegment<byte>(data), CancellationToken.None);
|
WebSocketReceiveResult result;
|
||||||
Console.WriteLine(result.MessageType + ", " + result.Count + ", " + result.EndOfMessage);
|
do
|
||||||
Console.WriteLine(Encoding.UTF8.GetString(data, 0, result.Count));
|
{
|
||||||
|
result = await socket.ReceiveAsync(new ArraySegment<byte>(data), CancellationToken.None);
|
||||||
|
// Console.WriteLine("Received: " + result.MessageType + ", " + result.Count + ", " + result.EndOfMessage);
|
||||||
|
} while (!result.EndOfMessage);
|
||||||
|
// Console.WriteLine(Encoding.UTF8.GetString(data, 0, result.Count));
|
||||||
}
|
}
|
||||||
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None);
|
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ namespace TestServer
|
||||||
|
|
||||||
while (received.MessageType != WebSocketMessageType.Close)
|
while (received.MessageType != WebSocketMessageType.Close)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Echo");
|
// Console.WriteLine("Echo, " + received.Count + ", " + received.MessageType + ", " + received.EndOfMessage);
|
||||||
// Echo anything we receive
|
// Echo anything we receive
|
||||||
await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, received.Count), received.MessageType, received.EndOfMessage, CancellationToken.None);
|
await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, received.Count), received.MessageType, received.EndOfMessage, CancellationToken.None);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue