1
1
using System ;
2
- using System . Collections ;
3
2
using System . Collections . Generic ;
4
3
using UnityEngine ;
5
4
using NetcodeNetworkEvent = Unity . Netcode . NetworkEvent ;
@@ -57,6 +56,7 @@ private enum State
57
56
private NetworkDriver m_Driver ;
58
57
private List < INetworkParameter > m_NetworkParameters ;
59
58
private byte [ ] m_MessageBuffer ;
59
+ private NetworkConnection m_ServerConnection ;
60
60
private ulong m_ServerClientId ;
61
61
62
62
private NetworkPipeline m_UnreliableSequencedPipeline ;
@@ -153,7 +153,7 @@ private NetworkPipeline SelectSendPipeline(NetworkDelivery delivery, int size)
153
153
}
154
154
}
155
155
156
- private IEnumerator ClientBindAndConnect ( SocketTask task )
156
+ private bool ClientBindAndConnect ( )
157
157
{
158
158
var serverEndpoint = default ( NetworkEndPoint ) ;
159
159
@@ -164,9 +164,7 @@ private IEnumerator ClientBindAndConnect(SocketTask task)
164
164
if ( m_RelayServerData . Equals ( default ( RelayServerData ) ) )
165
165
{
166
166
Debug . LogError ( "You must call SetRelayServerData() at least once before calling StartRelayServer." ) ;
167
- task . IsDone = true ;
168
- task . Success = false ;
169
- yield break ;
167
+ return false ;
170
168
}
171
169
172
170
m_NetworkParameters . Add ( new RelayNetworkParameter { ServerData = m_RelayServerData } ) ;
@@ -178,66 +176,39 @@ private IEnumerator ClientBindAndConnect(SocketTask task)
178
176
179
177
InitDriver ( ) ;
180
178
181
- if ( m_Driver . Bind ( NetworkEndPoint . AnyIpv4 ) != 0 )
179
+ int result = m_Driver . Bind ( NetworkEndPoint . AnyIpv4 ) ;
180
+ if ( result != 0 )
182
181
{
183
182
Debug . LogError ( "Client failed to bind" ) ;
183
+ return false ;
184
184
}
185
- else
186
- {
187
- while ( ! m_Driver . Bound )
188
- {
189
- yield return null ;
190
- }
191
-
192
- var serverConnection = m_Driver . Connect ( serverEndpoint ) ;
193
- m_ServerClientId = ParseClientId ( serverConnection ) ;
194
185
195
- while ( m_Driver . GetConnectionState ( serverConnection ) == NetworkConnection . State . Connecting )
196
- {
197
- yield return null ;
198
- }
199
-
200
- if ( m_Driver . GetConnectionState ( serverConnection ) == NetworkConnection . State . Connected )
201
- {
202
- task . Success = true ;
203
- m_State = State . Connected ;
204
- }
205
- else
206
- {
207
- Debug . LogError ( "Client failed to connect to server" ) ;
208
- }
209
- }
186
+ m_ServerConnection = m_Driver . Connect ( serverEndpoint ) ;
187
+ m_ServerClientId = ParseClientId ( m_ServerConnection ) ;
210
188
211
- task . IsDone = true ;
189
+ return true ;
212
190
}
213
191
214
- private IEnumerator ServerBindAndListen ( SocketTask task , NetworkEndPoint endPoint )
192
+ private bool ServerBindAndListen ( NetworkEndPoint endPoint )
215
193
{
216
194
InitDriver ( ) ;
217
195
218
- if ( m_Driver . Bind ( endPoint ) != 0 )
196
+ int result = m_Driver . Bind ( endPoint ) ;
197
+ if ( result != 0 )
219
198
{
220
199
Debug . LogError ( "Server failed to bind" ) ;
200
+ return false ;
221
201
}
222
- else
223
- {
224
- while ( ! m_Driver . Bound )
225
- {
226
- yield return null ;
227
- }
228
202
229
- if ( m_Driver . Listen ( ) == 0 )
230
- {
231
- task . Success = true ;
232
- m_State = State . Listening ;
233
- }
234
- else
235
- {
236
- Debug . LogError ( "Server failed to listen" ) ;
237
- }
203
+ result = m_Driver . Listen ( ) ;
204
+ if ( result != 0 )
205
+ {
206
+ Debug . LogError ( "Server failed to listen" ) ;
207
+ return false ;
238
208
}
239
209
240
- task . IsDone = true ;
210
+ m_State = State . Listening ;
211
+ return true ;
241
212
}
242
213
243
214
private static RelayAllocationId ConvertFromAllocationIdBytes ( byte [ ] allocationIdBytes )
@@ -306,22 +277,19 @@ public void SetConnectionData(string ipv4Address, ushort port)
306
277
m_ServerPort = port ;
307
278
}
308
279
309
- private IEnumerator StartRelayServer ( SocketTask task )
280
+ private bool StartRelayServer ( )
310
281
{
311
282
//This comparison is currently slow since RelayServerData does not implement a custom comparison operator that doesn't use
312
283
//reflection, but this does not live in the context of a performance-critical loop, it runs once at initial connection time.
313
284
if ( m_RelayServerData . Equals ( default ( RelayServerData ) ) )
314
285
{
315
286
Debug . LogError ( "You must call SetRelayServerData() at least once before calling StartRelayServer." ) ;
316
- task . IsDone = true ;
317
- task . Success = false ;
318
- yield break ;
287
+ return false ;
319
288
}
320
289
else
321
290
{
322
291
m_NetworkParameters . Add ( new RelayNetworkParameter { ServerData = m_RelayServerData } ) ;
323
-
324
- yield return ServerBindAndListen ( task , NetworkEndPoint . AnyIpv4 ) ;
292
+ return ServerBindAndListen ( NetworkEndPoint . AnyIpv4 ) ;
325
293
}
326
294
}
327
295
@@ -336,7 +304,7 @@ private bool AcceptConnection()
336
304
337
305
InvokeOnTransportEvent ( NetcodeNetworkEvent . Connect ,
338
306
ParseClientId ( connection ) ,
339
- default ( ArraySegment < byte > ) ,
307
+ default ,
340
308
Time . realtimeSinceStartup ) ;
341
309
342
310
return true ;
@@ -350,37 +318,53 @@ private bool ProcessEvent()
350
318
switch ( eventType )
351
319
{
352
320
case TransportNetworkEvent . Type . Connect :
353
- InvokeOnTransportEvent ( NetcodeNetworkEvent . Connect ,
354
- ParseClientId ( networkConnection ) ,
355
- default ( ArraySegment < byte > ) ,
356
- Time . realtimeSinceStartup ) ;
357
- return true ;
321
+ {
322
+ InvokeOnTransportEvent ( NetcodeNetworkEvent . Connect ,
323
+ ParseClientId ( networkConnection ) ,
324
+ default ( ArraySegment < byte > ) ,
325
+ Time . realtimeSinceStartup ) ;
358
326
327
+ m_State = State . Connected ;
328
+ return true ;
329
+ }
359
330
case TransportNetworkEvent . Type . Disconnect :
360
- InvokeOnTransportEvent ( NetcodeNetworkEvent . Disconnect ,
361
- ParseClientId ( networkConnection ) ,
362
- default ( ArraySegment < byte > ) ,
363
- Time . realtimeSinceStartup ) ;
364
- return true ;
331
+ {
332
+ InvokeOnTransportEvent ( NetcodeNetworkEvent . Disconnect ,
333
+ ParseClientId ( networkConnection ) ,
334
+ default ( ArraySegment < byte > ) ,
335
+ Time . realtimeSinceStartup ) ;
365
336
337
+ if ( m_ServerConnection . IsCreated )
338
+ {
339
+ m_ServerConnection = default ;
340
+ if ( m_Driver . GetConnectionState ( m_ServerConnection ) == NetworkConnection . State . Connecting )
341
+ {
342
+ Debug . LogError ( "Client failed to connect to server" ) ;
343
+ }
344
+ }
345
+
346
+ m_State = State . Disconnected ;
347
+ return true ;
348
+ }
366
349
case TransportNetworkEvent . Type . Data :
367
- var isBatched = reader . ReadByte ( ) ;
368
- if ( isBatched == 1 )
369
350
{
370
- while ( reader . GetBytesRead ( ) < reader . Length )
351
+ var isBatched = reader . ReadByte ( ) ;
352
+ if ( isBatched == 1 )
353
+ {
354
+ while ( reader . GetBytesRead ( ) < reader . Length )
355
+ {
356
+ var payloadSize = reader . ReadInt ( ) ;
357
+ ReadData ( payloadSize , ref reader , ref networkConnection ) ;
358
+ }
359
+ }
360
+ else // If is not batched, then read the entire buffer at once
371
361
{
372
362
var payloadSize = reader . ReadInt ( ) ;
373
363
ReadData ( payloadSize , ref reader , ref networkConnection ) ;
374
364
}
375
- }
376
- else // If is not batched, then read the entire buffer at once
377
- {
378
- var payloadSize = reader . ReadInt ( ) ;
379
365
380
- ReadData ( payloadSize , ref reader , ref networkConnection ) ;
366
+ return true ;
381
367
}
382
-
383
- return true ;
384
368
}
385
369
386
370
return false ;
@@ -428,7 +412,6 @@ private void Update()
428
412
;
429
413
}
430
414
}
431
-
432
415
}
433
416
434
417
private void OnDestroy ( )
@@ -593,11 +576,9 @@ private unsafe void SendBatchedMessage(ulong clientId, ref NativeArray<byte> dat
593
576
Debug . LogError ( $ "Error sending the message { result } ") ;
594
577
}
595
578
596
- private unsafe void SendMessageInstantly ( ulong clientId , ArraySegment < byte > data ,
597
- NetworkPipeline pipeline )
579
+ private unsafe void SendMessageInstantly ( ulong clientId , ArraySegment < byte > data , NetworkPipeline pipeline )
598
580
{
599
- var payloadSize =
600
- data . Count + 1 + 4 ; // 1 byte to indicate if the message is batched and 4 for the payload size
581
+ var payloadSize = data . Count + 1 + 4 ; // 1 byte to indicate if the message is batched and 4 for the payload size
601
582
var result = m_Driver . BeginSend ( pipeline , ParseClientId ( clientId ) , out var writer , payloadSize ) ;
602
583
if ( result == 0 )
603
584
{
@@ -656,37 +637,32 @@ private void SendBatchedMessageAndClearQueue(SendTarget sendTarget, SendQueue se
656
637
sendQueue . Clear ( ) ;
657
638
}
658
639
659
- public override SocketTasks StartClient ( )
640
+ public override bool StartClient ( )
660
641
{
661
642
if ( m_Driver . IsCreated )
662
643
{
663
- return SocketTask . Fault . AsTasks ( ) ;
644
+ return false ;
664
645
}
665
646
666
- var task = SocketTask . Working ;
667
- StartCoroutine ( ClientBindAndConnect ( task ) ) ;
668
- return task . AsTasks ( ) ;
647
+ return ClientBindAndConnect ( ) ;
669
648
}
670
649
671
- public override SocketTasks StartServer ( )
650
+ public override bool StartServer ( )
672
651
{
673
652
if ( m_Driver . IsCreated )
674
653
{
675
- return SocketTask . Fault . AsTasks ( ) ;
654
+ return false ;
676
655
}
677
656
678
- var task = SocketTask . Working ;
679
657
switch ( m_ProtocolType )
680
658
{
681
659
case ProtocolType . UnityTransport :
682
- StartCoroutine ( ServerBindAndListen ( task , NetworkEndPoint . Parse ( m_ServerAddress , m_ServerPort ) ) ) ;
683
- break ;
660
+ return ServerBindAndListen ( NetworkEndPoint . Parse ( m_ServerAddress , m_ServerPort ) ) ;
684
661
case ProtocolType . RelayUnityTransport :
685
- StartCoroutine ( StartRelayServer ( task ) ) ;
686
- break ;
662
+ return StartRelayServer ( ) ;
663
+ default :
664
+ return false ;
687
665
}
688
-
689
- return task . AsTasks ( ) ;
690
666
}
691
667
692
668
public override void Shutdown ( )
0 commit comments