Added internal 'wait time' for the ping and close

This commit is contained in:
sta
2014-09-23 15:45:40 +09:00
parent b6b30e04d0
commit 14914787a6
8 changed files with 138 additions and 74 deletions

View File

@@ -424,7 +424,7 @@ namespace WebSocketSharp.Server
_state = ServerState.ShuttingDown;
}
_services.Stop (new CloseEventArgs (CloseStatusCode.ServerError), true);
_services.Stop (new CloseEventArgs (CloseStatusCode.ServerError), true, false);
_listener.Abort ();
_state = ServerState.Stop;
@@ -696,7 +696,7 @@ namespace WebSocketSharp.Server
_state = ServerState.ShuttingDown;
}
_services.Stop (new CloseEventArgs (), true);
_services.Stop (new CloseEventArgs (), true, true);
stopReceiving (5000);
_state = ServerState.Stop;
@@ -729,7 +729,9 @@ namespace WebSocketSharp.Server
_state = ServerState.ShuttingDown;
}
_services.Stop (e, !code.IsReserved ());
var send = !code.IsReserved ();
_services.Stop (e, send, send);
stopReceiving (5000);
_state = ServerState.Stop;
@@ -762,7 +764,9 @@ namespace WebSocketSharp.Server
_state = ServerState.ShuttingDown;
}
_services.Stop (e, !code.IsReserved ());
var send = !code.IsReserved ();
_services.Stop (e, send, send);
stopReceiving (5000);
_state = ServerState.Stop;

View File

@@ -315,8 +315,9 @@ namespace WebSocketSharp.Server
_sessions = sessions;
_websocket = context.WebSocket;
_websocket.Protocol = _protocol;
_websocket.CustomHandshakeRequestChecker = checkIfValidConnectionRequest;
_websocket.Protocol = _protocol;
_websocket.WaitTime = sessions.WaitTime;
_websocket.OnOpen += onOpen;
_websocket.OnMessage += onMessage;

View File

@@ -507,7 +507,7 @@ namespace WebSocketSharp.Server
}
_listener.Stop ();
_services.Stop (new CloseEventArgs (CloseStatusCode.ServerError), true);
_services.Stop (new CloseEventArgs (CloseStatusCode.ServerError), true, false);
_state = ServerState.Stop;
}
@@ -793,7 +793,7 @@ namespace WebSocketSharp.Server
}
stopReceiving (5000);
_services.Stop (new CloseEventArgs (), true);
_services.Stop (new CloseEventArgs (), true, true);
_state = ServerState.Stop;
}
@@ -826,7 +826,9 @@ namespace WebSocketSharp.Server
}
stopReceiving (5000);
_services.Stop (e, !code.IsReserved ());
var send = !code.IsReserved ();
_services.Stop (e, send, send);
_state = ServerState.Stop;
}
@@ -859,7 +861,9 @@ namespace WebSocketSharp.Server
}
stopReceiving (5000);
_services.Stop (e, !code.IsReserved ());
var send = !code.IsReserved ();
_services.Stop (e, send, send);
_state = ServerState.Stop;
}

View File

@@ -67,6 +67,16 @@ namespace WebSocketSharp.Server
}
}
internal TimeSpan WaitTime {
get {
return Sessions.WaitTime;
}
set {
Sessions.WaitTime = value;
}
}
#endregion
#region Public Properties
@@ -122,11 +132,13 @@ namespace WebSocketSharp.Server
internal void Stop (ushort code, string reason)
{
var e = new CloseEventArgs (code, reason);
var bytes = !code.IsReserved ()
? WebSocketFrame.CreateCloseFrame (Mask.Unmask, e.PayloadData).ToByteArray ()
: null;
Sessions.Stop (e, bytes);
var send = !code.IsReserved ();
var bytes =
send ? WebSocketFrame.CreateCloseFrame (e.PayloadData, false).ToByteArray () : null;
var timeout = send ? WaitTime : TimeSpan.Zero;
Sessions.Stop (e, bytes, timeout);
}
#endregion

View File

@@ -49,6 +49,7 @@ namespace WebSocketSharp.Server
private Logger _logger;
private volatile ServerState _state;
private object _sync;
private TimeSpan _waitTime;
#endregion
@@ -67,6 +68,28 @@ namespace WebSocketSharp.Server
_hosts = new Dictionary<string, WebSocketServiceHost> ();
_state = ServerState.Ready;
_sync = ((ICollection) _hosts).SyncRoot;
_waitTime = TimeSpan.FromSeconds (1);
}
#endregion
#region Internal Properties
internal TimeSpan WaitTime {
get {
return _waitTime;
}
set {
lock (_sync) {
if (value == _waitTime)
return;
_waitTime = value;
foreach (var host in _hosts.Values)
host.WaitTime = value;
}
}
}
#endregion
@@ -240,14 +263,14 @@ namespace WebSocketSharp.Server
}
private Dictionary<string, Dictionary<string, bool>> broadping (
byte[] frameAsBytes, int millisecondsTimeout)
byte[] frameAsBytes, TimeSpan timeout)
{
var res = new Dictionary<string, Dictionary<string, bool>> ();
foreach (var host in Hosts) {
if (_state != ServerState.Start)
break;
res.Add (host.Path, host.Sessions.Broadping (frameAsBytes, millisecondsTimeout));
res.Add (host.Path, host.Sessions.Broadping (frameAsBytes, timeout));
}
return res;
@@ -275,6 +298,9 @@ namespace WebSocketSharp.Server
if (!_clean)
host.KeepClean = false;
if (_waitTime != host.WaitTime)
host.WaitTime = _waitTime;
if (_state == ServerState.Start)
host.Start ();
@@ -325,16 +351,17 @@ namespace WebSocketSharp.Server
}
}
internal void Stop (CloseEventArgs e, bool send)
internal void Stop (CloseEventArgs e, bool send, bool wait)
{
lock (_sync) {
_state = ServerState.ShuttingDown;
var bytes = send
? WebSocketFrame.CreateCloseFrame (Mask.Unmask, e.PayloadData).ToByteArray ()
: null;
var bytes =
send ? WebSocketFrame.CreateCloseFrame (e.PayloadData, false).ToByteArray () : null;
var timeout = wait ? _waitTime : TimeSpan.Zero;
foreach (var host in _hosts.Values)
host.Sessions.Stop (e, bytes);
host.Sessions.Stop (e, bytes, timeout);
_hosts.Clear ();
_state = ServerState.Stop;
@@ -512,7 +539,7 @@ namespace WebSocketSharp.Server
return null;
}
return broadping (WebSocketFrame.EmptyUnmaskPingData, 1000);
return broadping (WebSocketFrame.EmptyUnmaskPingData, _waitTime);
}
/// <summary>
@@ -543,7 +570,7 @@ namespace WebSocketSharp.Server
return null;
}
return broadping (WebSocketFrame.CreatePingFrame (Mask.Unmask, data).ToByteArray (), 1000);
return broadping (WebSocketFrame.CreatePingFrame (data, false).ToByteArray (), _waitTime);
}
/// <summary>

View File

@@ -51,6 +51,7 @@ namespace WebSocketSharp.Server
private volatile bool _sweeping;
private System.Timers.Timer _sweepTimer;
private object _sync;
private TimeSpan _waitTime;
#endregion
@@ -70,6 +71,7 @@ namespace WebSocketSharp.Server
_sessions = new Dictionary<string, IWebSocketSession> ();
_state = ServerState.Ready;
_sync = ((ICollection) _sessions).SyncRoot;
_waitTime = TimeSpan.FromSeconds (1);
setSweepTimer (60000);
}
@@ -84,6 +86,21 @@ namespace WebSocketSharp.Server
}
}
internal TimeSpan WaitTime {
get {
return _waitTime;
}
set {
if (value == _waitTime)
return;
_waitTime = value;
foreach (var session in Sessions)
session.Context.WebSocket.WaitTime = value;
}
}
#endregion
#region Public Properties
@@ -97,7 +114,7 @@ namespace WebSocketSharp.Server
/// </value>
public IEnumerable<string> ActiveIDs {
get {
foreach (var res in Broadping (WebSocketFrame.EmptyUnmaskPingData, 1000))
foreach (var res in Broadping (WebSocketFrame.EmptyUnmaskPingData, _waitTime))
if (res.Value)
yield return res.Key;
}
@@ -142,7 +159,7 @@ namespace WebSocketSharp.Server
/// </value>
public IEnumerable<string> InactiveIDs {
get {
foreach (var res in Broadping (WebSocketFrame.EmptyUnmaskPingData, 1000))
foreach (var res in Broadping (WebSocketFrame.EmptyUnmaskPingData, _waitTime))
if (!res.Value)
yield return res.Key;
}
@@ -318,14 +335,14 @@ namespace WebSocketSharp.Server
}
}
internal Dictionary<string, bool> Broadping (byte[] frameAsBytes, int millisecondsTimeout)
internal Dictionary<string, bool> Broadping (byte[] frameAsBytes, TimeSpan timeout)
{
var res = new Dictionary<string, bool> ();
foreach (var session in Sessions) {
if (_state != ServerState.Start)
break;
res.Add (session.ID, session.Context.WebSocket.Ping (frameAsBytes, millisecondsTimeout));
res.Add (session.ID, session.Context.WebSocket.Ping (frameAsBytes, timeout));
}
return res;
@@ -345,14 +362,14 @@ namespace WebSocketSharp.Server
}
}
internal void Stop (CloseEventArgs e, byte[] frameAsBytes)
internal void Stop (CloseEventArgs e, byte[] frameAsBytes, TimeSpan timeout)
{
lock (_sync) {
_state = ServerState.ShuttingDown;
_sweepTimer.Enabled = false;
foreach (var session in _sessions.Values.ToList ())
session.Context.WebSocket.Close (e, frameAsBytes, 1000);
session.Context.WebSocket.Close (e, frameAsBytes, timeout);
_state = ServerState.Stop;
}
@@ -528,7 +545,7 @@ namespace WebSocketSharp.Server
return null;
}
return Broadping (WebSocketFrame.EmptyUnmaskPingData, 1000);
return Broadping (WebSocketFrame.EmptyUnmaskPingData, _waitTime);
}
/// <summary>
@@ -557,7 +574,7 @@ namespace WebSocketSharp.Server
return null;
}
return Broadping (WebSocketFrame.CreatePingFrame (Mask.Unmask, data).ToByteArray (), 1000);
return Broadping (WebSocketFrame.CreatePingFrame (data, false).ToByteArray (), _waitTime);
}
/// <summary>