Skip to content

Commit a2b3b4c

Browse files
shenghao0219shenghao
andauthored
修复握手超时出队问题 (#659)
Co-authored-by: shenghao <shenghao0219@icloud.com>
1 parent 86263bc commit a2b3b4c

1 file changed

Lines changed: 39 additions & 31 deletions

File tree

src/SuperSocket.WebSocket.Server/WebSocketServerMiddleware.cs

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -85,50 +85,58 @@ private void HandshakePendingQueueCheckingCallback(object state)
8585
{
8686
_checkingTimer.Change(Timeout.Infinite, Timeout.Infinite);
8787

88-
while (true)
88+
var openHandshakeTimeTask = Task.Run(() =>
8989
{
90-
WebSocketSession session;
90+
while (true)
91+
{
92+
WebSocketSession session;
9193

92-
if (!_openHandshakePendingQueue.TryPeek(out session))
93-
break;
94+
if (!_openHandshakePendingQueue.TryPeek(out session))
95+
break;
9496

95-
if (session.Handshaked || session.State == SessionState.Closed || (session is IAppSession appSession && appSession.Channel.IsClosed))
96-
{
97-
//Handshaked or not connected
97+
if (session.Handshaked || session.State == SessionState.Closed || (session is IAppSession appSession && appSession.Channel.IsClosed))
98+
{
99+
//Handshaked or not connected
100+
_openHandshakePendingQueue.TryDequeue(out session);
101+
continue;
102+
}
103+
104+
if (DateTime.Now < session.StartTime.AddSeconds(_options.OpenHandshakeTimeOut))
105+
break;
106+
107+
//Timeout, dequeue and then close
98108
_openHandshakePendingQueue.TryDequeue(out session);
99-
continue;
109+
session.CloseWithoutHandshake();
100110
}
111+
});
101112

102-
if (DateTime.Now < session.StartTime.AddSeconds(_options.OpenHandshakeTimeOut))
103-
break;
113+
var closeHandshakeTimeTask = Task.Run(() =>
114+
{
115+
while (true)
116+
{
117+
WebSocketSession session;
104118

105-
//Timeout, dequeue and then close
106-
_openHandshakePendingQueue.TryDequeue(out session);
107-
session.CloseWithoutHandshake();
108-
}
119+
if (!_closeHandshakePendingQueue.TryPeek(out session))
120+
break;
109121

110-
while (true)
111-
{
112-
WebSocketSession session;
122+
if (session.State == SessionState.Closed)
123+
{
124+
//the session has been closed
125+
_closeHandshakePendingQueue.TryDequeue(out session);
126+
continue;
127+
}
113128

114-
if (!_closeHandshakePendingQueue.TryPeek(out session))
115-
break;
129+
if (DateTime.Now < session.CloseHandshakeStartTime.AddSeconds(_options.CloseHandshakeTimeOut))
130+
break;
116131

117-
if (session.State == SessionState.Closed)
118-
{
119-
//the session has been closed
132+
//Timeout, dequeue and then close
120133
_closeHandshakePendingQueue.TryDequeue(out session);
121-
continue;
134+
//Needn't send closing handshake again
135+
session.CloseWithoutHandshake();
122136
}
137+
});
123138

124-
if (DateTime.Now < session.CloseHandshakeStartTime.AddSeconds(_options.CloseHandshakeTimeOut))
125-
break;
126-
127-
//Timeout, dequeue and then close
128-
_closeHandshakePendingQueue.TryDequeue(out session);
129-
//Needn't send closing handshake again
130-
session.CloseWithoutHandshake();
131-
}
139+
Task.WhenAll(openHandshakeTimeTask, closeHandshakeTimeTask);
132140

133141
_checkingTimer?.Change(_options.CheckingInterval * 1000, _options.CheckingInterval * 1000);
134142
}

0 commit comments

Comments
 (0)