|
|
|
@ -101,6 +101,7 @@ namespace WebSocketSharp
|
|
|
|
private TcpClient _tcpClient;
|
|
|
|
private TcpClient _tcpClient;
|
|
|
|
private Uri _uri;
|
|
|
|
private Uri _uri;
|
|
|
|
private const string _version = "13";
|
|
|
|
private const string _version = "13";
|
|
|
|
|
|
|
|
private TimeSpan _waitTime;
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
@ -122,6 +123,7 @@ namespace WebSocketSharp
|
|
|
|
_closeContext = context.Close;
|
|
|
|
_closeContext = context.Close;
|
|
|
|
_secure = context.IsSecureConnection;
|
|
|
|
_secure = context.IsSecureConnection;
|
|
|
|
_stream = context.Stream;
|
|
|
|
_stream = context.Stream;
|
|
|
|
|
|
|
|
_waitTime = TimeSpan.FromSeconds (1);
|
|
|
|
|
|
|
|
|
|
|
|
init ();
|
|
|
|
init ();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -136,6 +138,7 @@ namespace WebSocketSharp
|
|
|
|
_closeContext = context.Close;
|
|
|
|
_closeContext = context.Close;
|
|
|
|
_secure = context.IsSecureConnection;
|
|
|
|
_secure = context.IsSecureConnection;
|
|
|
|
_stream = context.Stream;
|
|
|
|
_stream = context.Stream;
|
|
|
|
|
|
|
|
_waitTime = TimeSpan.FromSeconds (1);
|
|
|
|
|
|
|
|
|
|
|
|
init ();
|
|
|
|
init ();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -191,6 +194,7 @@ namespace WebSocketSharp
|
|
|
|
_client = true;
|
|
|
|
_client = true;
|
|
|
|
_logger = new Logger ();
|
|
|
|
_logger = new Logger ();
|
|
|
|
_secure = _uri.Scheme == "wss";
|
|
|
|
_secure = _uri.Scheme == "wss";
|
|
|
|
|
|
|
|
_waitTime = TimeSpan.FromSeconds (5);
|
|
|
|
|
|
|
|
|
|
|
|
init ();
|
|
|
|
init ();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -222,6 +226,16 @@ namespace WebSocketSharp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
internal TimeSpan WaitTime {
|
|
|
|
|
|
|
|
get {
|
|
|
|
|
|
|
|
return _waitTime;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set {
|
|
|
|
|
|
|
|
_waitTime = value;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region Public Properties
|
|
|
|
#region Public Properties
|
|
|
|
@ -596,18 +610,10 @@ namespace WebSocketSharp
|
|
|
|
|
|
|
|
|
|
|
|
_logger.Trace ("Start closing the connection.");
|
|
|
|
_logger.Trace ("Start closing the connection.");
|
|
|
|
|
|
|
|
|
|
|
|
e.WasClean =
|
|
|
|
e.WasClean = closeHandshake (
|
|
|
|
_client
|
|
|
|
WebSocketFrame.CreateCloseFrame (e.PayloadData, _client).ToByteArray (),
|
|
|
|
? closeHandshake (
|
|
|
|
wait ? _waitTime : TimeSpan.Zero,
|
|
|
|
send ? WebSocketFrame.CreateCloseFrame (Mask.Mask, e.PayloadData).ToByteArray ()
|
|
|
|
_client ? (Action) releaseClientResources : releaseServerResources);
|
|
|
|
: null,
|
|
|
|
|
|
|
|
wait ? 5000 : 0,
|
|
|
|
|
|
|
|
releaseClientResources)
|
|
|
|
|
|
|
|
: closeHandshake (
|
|
|
|
|
|
|
|
send ? WebSocketFrame.CreateCloseFrame (Mask.Unmask, e.PayloadData).ToByteArray ()
|
|
|
|
|
|
|
|
: null,
|
|
|
|
|
|
|
|
wait ? 1000 : 0,
|
|
|
|
|
|
|
|
releaseServerResources);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_logger.Trace ("End closing the connection.");
|
|
|
|
_logger.Trace ("End closing the connection.");
|
|
|
|
|
|
|
|
|
|
|
|
@ -627,13 +633,11 @@ namespace WebSocketSharp
|
|
|
|
closer.BeginInvoke (e, send, wait, ar => closer.EndInvoke (ar), null);
|
|
|
|
closer.BeginInvoke (e, send, wait, ar => closer.EndInvoke (ar), null);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private bool closeHandshake (byte[] frameAsBytes, int millisecondsTimeout, Action release)
|
|
|
|
private bool closeHandshake (byte[] frameAsBytes, TimeSpan timeout, Action release)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var sent = frameAsBytes != null && sendBytes (frameAsBytes);
|
|
|
|
var sent = frameAsBytes != null && sendBytes (frameAsBytes);
|
|
|
|
var received = millisecondsTimeout == 0 ||
|
|
|
|
var received = timeout == TimeSpan.Zero ||
|
|
|
|
(sent &&
|
|
|
|
(sent && _exitReceiving != null && _exitReceiving.WaitOne (timeout));
|
|
|
|
_exitReceiving != null &&
|
|
|
|
|
|
|
|
_exitReceiving.WaitOne (millisecondsTimeout));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
release ();
|
|
|
|
release ();
|
|
|
|
if (_receivePong != null) {
|
|
|
|
if (_receivePong != null) {
|
|
|
|
@ -1412,7 +1416,7 @@ namespace WebSocketSharp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
// As server
|
|
|
|
internal void Close (CloseEventArgs e, byte[] frameAsBytes, int millisecondsTimeout)
|
|
|
|
internal void Close (CloseEventArgs e, byte[] frameAsBytes, TimeSpan timeout)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
lock (_forConn) {
|
|
|
|
lock (_forConn) {
|
|
|
|
if (_readyState == WebSocketState.Closing || _readyState == WebSocketState.Closed) {
|
|
|
|
if (_readyState == WebSocketState.Closing || _readyState == WebSocketState.Closed) {
|
|
|
|
@ -1423,7 +1427,7 @@ namespace WebSocketSharp
|
|
|
|
_readyState = WebSocketState.Closing;
|
|
|
|
_readyState = WebSocketState.Closing;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
e.WasClean = closeHandshake (frameAsBytes, millisecondsTimeout, releaseServerResources);
|
|
|
|
e.WasClean = closeHandshake (frameAsBytes, timeout, releaseServerResources);
|
|
|
|
|
|
|
|
|
|
|
|
_readyState = WebSocketState.Closed;
|
|
|
|
_readyState = WebSocketState.Closed;
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
@ -1468,14 +1472,14 @@ namespace WebSocketSharp
|
|
|
|
return Convert.ToBase64String (src);
|
|
|
|
return Convert.ToBase64String (src);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
internal bool Ping (byte[] frameAsBytes, int millisecondsTimeout)
|
|
|
|
internal bool Ping (byte[] frameAsBytes, TimeSpan timeout)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
AutoResetEvent pong;
|
|
|
|
AutoResetEvent pong;
|
|
|
|
return _readyState == WebSocketState.Open &&
|
|
|
|
return _readyState == WebSocketState.Open &&
|
|
|
|
send (frameAsBytes) &&
|
|
|
|
send (frameAsBytes) &&
|
|
|
|
(pong = _receivePong) != null &&
|
|
|
|
(pong = _receivePong) != null &&
|
|
|
|
pong.WaitOne (millisecondsTimeout);
|
|
|
|
pong.WaitOne (timeout);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (Exception ex) {
|
|
|
|
catch (Exception ex) {
|
|
|
|
_logger.Fatal (ex.ToString ());
|
|
|
|
_logger.Fatal (ex.ToString ());
|
|
|
|
@ -1879,9 +1883,11 @@ namespace WebSocketSharp
|
|
|
|
/// </returns>
|
|
|
|
/// </returns>
|
|
|
|
public bool Ping ()
|
|
|
|
public bool Ping ()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return _client
|
|
|
|
var bytes = _client
|
|
|
|
? Ping (WebSocketFrame.CreatePingFrame (Mask.Mask).ToByteArray (), 5000)
|
|
|
|
? WebSocketFrame.CreatePingFrame (true).ToByteArray ()
|
|
|
|
: Ping (WebSocketFrame.EmptyUnmaskPingData, 1000);
|
|
|
|
: WebSocketFrame.EmptyUnmaskPingData;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Ping (bytes, _waitTime);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// <summary>
|
|
|
|
@ -1908,9 +1914,7 @@ namespace WebSocketSharp
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return _client
|
|
|
|
return Ping (WebSocketFrame.CreatePingFrame (data, _client).ToByteArray (), _waitTime);
|
|
|
|
? Ping (WebSocketFrame.CreatePingFrame (Mask.Mask, data).ToByteArray (), 5000)
|
|
|
|
|
|
|
|
: Ping (WebSocketFrame.CreatePingFrame (Mask.Unmask, data).ToByteArray (), 1000);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// <summary>
|
|
|
|
|