@@ -39,7 +39,6 @@ public TcpNetworkHandlerBase(TServerHook serverHook, TNetworkSender networkSende
39
39
40
40
remoteEndpoint = socket . RemoteEndPoint is IPEndPoint remote ? $ "{ remote . Address } :{ remote . Port } " : "" ;
41
41
localEndpoint = socket . LocalEndPoint is IPEndPoint local ? $ "{ local . Address } :{ local . Port } " : "" ;
42
-
43
42
AllocateNetworkReceiveBuffer ( ) ;
44
43
}
45
44
@@ -52,28 +51,28 @@ public TcpNetworkHandlerBase(TServerHook serverHook, TNetworkSender networkSende
52
51
/// <inheritdoc />
53
52
public override void Start ( SslServerAuthenticationOptions tlsOptions = null , string remoteEndpointName = null , CancellationToken token = default )
54
53
{
55
- Start ( ) ;
54
+ Start ( tlsOptions != null ) ;
56
55
base . Start ( tlsOptions , remoteEndpointName , token ) ;
57
56
}
58
57
59
58
/// <inheritdoc />
60
59
public override async Task StartAsync ( SslServerAuthenticationOptions tlsOptions = null , string remoteEndpointName = null , CancellationToken token = default )
61
60
{
62
- Start ( ) ;
61
+ Start ( tlsOptions != null ) ;
63
62
await base . StartAsync ( tlsOptions , remoteEndpointName , token ) . ConfigureAwait ( false ) ;
64
63
}
65
64
66
65
/// <inheritdoc />
67
66
public override void Start ( SslClientAuthenticationOptions tlsOptions , string remoteEndpointName = null , CancellationToken token = default )
68
67
{
69
- Start ( ) ;
68
+ Start ( tlsOptions != null ) ;
70
69
base . Start ( tlsOptions , remoteEndpointName , token ) ;
71
70
}
72
71
73
72
/// <inheritdoc />
74
73
public override async Task StartAsync ( SslClientAuthenticationOptions tlsOptions , string remoteEndpointName = null , CancellationToken token = default )
75
74
{
76
- Start ( ) ;
75
+ Start ( tlsOptions != null ) ;
77
76
await base . StartAsync ( tlsOptions , remoteEndpointName , token ) . ConfigureAwait ( false ) ;
78
77
}
79
78
@@ -102,17 +101,22 @@ public override bool TryClose()
102
101
return true ;
103
102
}
104
103
105
- void Start ( )
104
+ void Start ( bool useTLS )
106
105
{
107
106
var receiveEventArgs = new SocketAsyncEventArgs { AcceptSocket = socket } ;
108
107
receiveEventArgs . SetBuffer ( networkReceiveBuffer , 0 , networkReceiveBuffer . Length ) ;
109
- receiveEventArgs . Completed += RecvEventArg_Completed ;
108
+ receiveEventArgs . Completed += useTLS ? RecvEventArgCompletedWithTLS : RecvEventArgCompletedWithoutTLS ;
110
109
111
110
// If the client already have packets, avoid handling it here on the handler so we don't block future accepts.
112
111
try
113
112
{
114
113
if ( ! socket . ReceiveAsync ( receiveEventArgs ) )
115
- Task . Run ( ( ) => RecvEventArg_Completed ( null , receiveEventArgs ) ) ;
114
+ {
115
+ if ( useTLS )
116
+ Task . Run ( ( ) => RecvEventArgCompletedWithTLS ( null , receiveEventArgs ) ) ;
117
+ else
118
+ Task . Run ( ( ) => RecvEventArgCompletedWithoutTLS ( null , receiveEventArgs ) ) ;
119
+ }
116
120
}
117
121
catch ( Exception ex )
118
122
{
@@ -134,7 +138,35 @@ void Dispose(SocketAsyncEventArgs e)
134
138
e . Dispose ( ) ;
135
139
}
136
140
137
- void RecvEventArg_Completed ( object sender , SocketAsyncEventArgs e )
141
+ void RecvEventArgCompletedWithTLS ( object sender , SocketAsyncEventArgs e ) =>
142
+ _ = HandleReceiveWithTLSAsync ( sender , e ) ;
143
+
144
+ void RecvEventArgCompletedWithoutTLS ( object sender , SocketAsyncEventArgs e ) =>
145
+ HandleReceiveWithoutTLS ( sender , e ) ;
146
+
147
+ private void HandleReceiveWithoutTLS ( object sender , SocketAsyncEventArgs e )
148
+ {
149
+ try
150
+ {
151
+ do
152
+ {
153
+ if ( e . BytesTransferred == 0 || e . SocketError != SocketError . Success || serverHook . Disposed )
154
+ {
155
+ // No more things to receive
156
+ Dispose ( e ) ;
157
+ break ;
158
+ }
159
+ OnNetworkReceiveWithoutTLS ( e . BytesTransferred ) ;
160
+ e . SetBuffer ( networkReceiveBuffer , networkBytesRead , networkReceiveBuffer . Length - networkBytesRead ) ;
161
+ } while ( ! e . AcceptSocket . ReceiveAsync ( e ) ) ;
162
+ }
163
+ catch ( Exception ex )
164
+ {
165
+ HandleReceiveFailure ( ex , e ) ;
166
+ }
167
+ }
168
+
169
+ private async ValueTask HandleReceiveWithTLSAsync ( object sender , SocketAsyncEventArgs e )
138
170
{
139
171
try
140
172
{
@@ -146,20 +178,29 @@ void RecvEventArg_Completed(object sender, SocketAsyncEventArgs e)
146
178
Dispose ( e ) ;
147
179
break ;
148
180
}
149
- OnNetworkReceive ( e . BytesTransferred ) ;
181
+ var receiveTask = OnNetworkReceiveWithTLSAsync ( e . BytesTransferred ) ;
182
+ if ( ! receiveTask . IsCompletedSuccessfully )
183
+ {
184
+ await receiveTask ;
185
+ }
150
186
e . SetBuffer ( networkReceiveBuffer , networkBytesRead , networkReceiveBuffer . Length - networkBytesRead ) ;
151
187
} while ( ! e . AcceptSocket . ReceiveAsync ( e ) ) ;
152
188
}
153
189
catch ( Exception ex )
154
190
{
155
- if ( ex is ObjectDisposedException ex2 && ex2 . ObjectName == "System.Net.Sockets.Socket" )
156
- logger ? . LogTrace ( "Accept socket was disposed at RecvEventArg_Completed" ) ;
157
- else
158
- logger ? . LogError ( ex , "An error occurred at RecvEventArg_Completed" ) ;
159
- Dispose ( e ) ;
191
+ HandleReceiveFailure ( ex , e ) ;
160
192
}
161
193
}
162
194
195
+ void HandleReceiveFailure ( Exception ex , SocketAsyncEventArgs e )
196
+ {
197
+ if ( ex is ObjectDisposedException ex2 && ex2 . ObjectName == "System.Net.Sockets.Socket" )
198
+ logger ? . LogTrace ( "Accept socket was disposed at RecvEventArg_Completed" ) ;
199
+ else
200
+ logger ? . LogError ( ex , "An error occurred at RecvEventArg_Completed" ) ;
201
+ Dispose ( e ) ;
202
+ }
203
+
163
204
unsafe void AllocateNetworkReceiveBuffer ( )
164
205
{
165
206
networkReceiveBufferEntry = networkPool . Get ( networkBufferSettings . initialReceiveBufferSize ) ;
0 commit comments