Fix for issue #4

This commit is contained in:
sta
2012-08-19 16:41:59 +09:00
parent 0f0a05feb2
commit 0bea2dd623
48 changed files with 37 additions and 29 deletions

View File

@@ -111,9 +111,18 @@ namespace WebSocketSharp.Frame
{
Fin = fin;
Opcode = opcode;
Masked = mask;
ulong dataLength = payloadData.Length;
if (dataLength == 0)
{
Masked = Mask.UNMASK;
}
else
{
Masked = mask;
}
if (dataLength < 126)
{
PayloadLen = (byte)dataLength;
@@ -130,6 +139,7 @@ namespace WebSocketSharp.Frame
}
PayloadData = payloadData;
if (Masked == Mask.MASK)
{
MaskingKey = new byte[4];
@@ -264,7 +274,11 @@ namespace WebSocketSharp.Frame
}
}
// Payload Data
if (buffer3Len <= (ulong)_readBufferLen)
if (buffer3Len == 0)
{
buffer3 = new byte[]{};
}
else if (buffer3Len <= (ulong)_readBufferLen)
{
buffer3 = new byte[buffer3Len];
readLen = stream.Read(buffer3, 0, (int)buffer3Len);

View File

@@ -74,6 +74,7 @@ namespace WebSocketSharp
private string _protocol;
private string _protocols;
private volatile WsState _readyState;
private AutoResetEvent _receivedPong;
private SslStream _sslStream;
private TcpClient _tcpClient;
private Uri _uri;
@@ -116,25 +117,8 @@ namespace WebSocketSharp
{
get
{
if (_tcpClient == null) return false;
var socket = _tcpClient.Client;
if (!socket.Connected) return false;
if (socket.Poll(0, SelectMode.SelectWrite) &&
!socket.Poll(0, SelectMode.SelectError))
{
// var buffer = new byte[1];
//
// if (socket.Receive(buffer, SocketFlags.Peek) != 0)
// {
// return true;
// }
return true;
}
return false;
if (_readyState != WsState.OPEN) return false;
return Ping();
}
}
@@ -198,6 +182,7 @@ namespace WebSocketSharp
_fragmentLen = 1024; // Max value is int.MaxValue - 14.
_protocol = String.Empty;
_readyState = WsState.CONNECTING;
_receivedPong = new AutoResetEvent(false);
_unTransmittedBuffer = new SynchronizedCollection<WsFrame>();
}
@@ -894,6 +879,7 @@ namespace WebSocketSharp
}
else if (frame.Opcode == Opcode.PONG)
{// FINAL & PONG
_receivedPong.Set();
OnMessage.Emit(this, new MessageEventArgs(frame.Opcode, frame.PayloadData));
}
else
@@ -913,7 +899,9 @@ namespace WebSocketSharp
{
case Opcode.TEXT:
case Opcode.BINARY:
goto default;
case Opcode.PONG:
_receivedPong.Set();
goto default;
case Opcode.CLOSE:
#if DEBUG
@@ -1194,12 +1182,12 @@ namespace WebSocketSharp
Close(CloseStatusCode.AWAY);
}
public void Ping()
public bool Ping()
{
Ping(String.Empty);
return Ping(String.Empty);
}
public void Ping(string data)
public bool Ping(string data)
{
var payloadData = new PayloadData(data);
@@ -1207,11 +1195,13 @@ namespace WebSocketSharp
{
var msg = "Ping frame must have a payload length of 125 bytes or less.";
error(msg);
return;
return false;
}
var frame = createFrame(Fin.FINAL, Opcode.PING, payloadData);
send(frame);
if (!send(frame)) return false;
return _receivedPong.WaitOne(5 * 1000);
}
public void Send(string data)

Binary file not shown.