10
10
using UnityObject = UnityEngine . Object ;
11
11
12
12
namespace TinyNet
13
- {
13
+ {
14
14
#region 发送和接收缓冲区
15
15
/// <summary>
16
16
/// 填充数据包
@@ -65,8 +65,8 @@ public static BufferSegment Make(byte onebyte)
65
65
} ;
66
66
return seg ;
67
67
}
68
- }
69
-
68
+ }
69
+
70
70
/// <summary>
71
71
/// 复用缓冲区
72
72
/// </summary>
@@ -192,9 +192,9 @@ public void Reset()
192
192
_offset = 0 ;
193
193
_length = 0 ;
194
194
}
195
- }
195
+ }
196
196
#endregion
197
-
197
+
198
198
#region 解析网络请求
199
199
/// <summary>
200
200
/// 基础请求类
@@ -239,8 +239,8 @@ public virtual void Reset()
239
239
{
240
240
buffer . Reset ( ) ;
241
241
}
242
- }
243
-
242
+ }
243
+
244
244
/// <summary>
245
245
/// 无ID分组
246
246
/// </summary>
@@ -259,8 +259,8 @@ protected virtual void Handle(NetHandler handler, T t)
259
259
}
260
260
261
261
public static event Action < NetHandler , T > DefaultHandler ;
262
- }
263
-
262
+ }
263
+
264
264
/// <summary>
265
265
/// 按ID分组
266
266
/// </summary>
@@ -296,9 +296,9 @@ public static Dictionary<TKey, Action<NetHandler, T>> Handlers
296
296
}
297
297
}
298
298
public static event Action < NetHandler , TKey , T > DefaultHandler ;
299
- }
299
+ }
300
300
#endregion
301
-
301
+
302
302
#region 设置相关
303
303
public class Settings
304
304
{
@@ -322,9 +322,9 @@ public Settings()
322
322
capacity = 2 << 24 ;
323
323
worklimit = 4 ;
324
324
}
325
- }
325
+ }
326
326
#endregion
327
-
327
+
328
328
/// <summary>
329
329
/// 网络连接抽象句柄
330
330
/// </summary>
@@ -340,8 +340,8 @@ public abstract class NetHandler
340
340
public abstract IPEndPoint Local { get ; }
341
341
public abstract short TTL { get ; set ; }
342
342
public abstract bool NoDelay { get ; set ; }
343
- }
344
-
343
+ }
344
+
345
345
/// <summary>
346
346
/// 网络管理全局接口
347
347
/// </summary>
@@ -353,18 +353,19 @@ public abstract class NetManager : IDisposable
353
353
private readonly Queue < NetHandlerImpl > workqueue = new Queue < NetHandlerImpl > ( ) ;
354
354
private readonly Dictionary < NetHandlerImpl , bool > workindex = new Dictionary < NetHandlerImpl , bool > ( ) ;
355
355
private readonly Dictionary < int , Control > listens = new Dictionary < int , Control > ( ) ;
356
+ private readonly Dictionary < int , Control > listensv6 = new Dictionary < int , Control > ( ) ;
356
357
private readonly Dictionary < NetHandlerImpl , bool > sockets = new Dictionary < NetHandlerImpl , bool > ( ) ;
357
358
358
- private static readonly Dictionary < NetManager , bool > managers = new Dictionary < NetManager , bool > ( ) ;
359
-
359
+ private static readonly Dictionary < NetManager , bool > managers = new Dictionary < NetManager , bool > ( ) ;
360
+
360
361
#region 内部使用的类
361
362
private class Control
362
363
{
363
364
public bool running ;
364
365
public Action < NetHandler > action ;
365
- }
366
+ }
366
367
#endregion
367
-
368
+
368
369
protected NetManager ( Settings settings )
369
370
{
370
371
this . settings = settings ;
@@ -383,7 +384,7 @@ public void Listen(int port, Action<NetHandler> callback)
383
384
{
384
385
if ( ! running )
385
386
throw new ObjectDisposedException ( ToString ( ) ) ;
386
- new Thread ( delegate ( )
387
+ new Thread ( delegate ( )
387
388
{
388
389
Thread . CurrentThread . Name = "Network Server" ;
389
390
TcpListener server = new TcpListener ( IPAddress . Any , port ) ;
@@ -430,6 +431,53 @@ public void Listen(int port, Action<NetHandler> callback)
430
431
}
431
432
server . Stop ( ) ;
432
433
} ) . Start ( ) ;
434
+ new Thread ( delegate ( )
435
+ {
436
+ Thread . CurrentThread . Name = "Network Server" ;
437
+ TcpListener server = new TcpListener ( IPAddress . IPv6Any , port ) ;
438
+ server . Start ( ) ;
439
+ Control ctrl ;
440
+ lock ( listensv6 )
441
+ {
442
+ if ( listensv6 . TryGetValue ( port , out ctrl ) )
443
+ {
444
+ ctrl . running = true ;
445
+ }
446
+ else
447
+ {
448
+ ctrl = new Control { running = true } ;
449
+ listensv6 [ port ] = ctrl ;
450
+ }
451
+ }
452
+ ctrl . action = callback ;
453
+ while ( running )
454
+ {
455
+ if ( ! server . Server . Poll ( 1000 , SelectMode . SelectRead ) )
456
+ {
457
+ if ( ! ctrl . running )
458
+ break ;
459
+ continue ;
460
+ }
461
+ if ( ! server . Pending ( ) )
462
+ break ;
463
+ NetHandlerImpl socket = new NetHandlerImpl ( server . AcceptSocket ( ) , this ) ;
464
+ socket . Socket . Blocking = false ;
465
+ socket . OnConnected ( ) ;
466
+ Loop . Run ( ( ) =>
467
+ {
468
+ ctrl . action ( socket ) ;
469
+ } ) ;
470
+ }
471
+ lock ( listensv6 )
472
+ {
473
+ Control ctrlnow ;
474
+ if ( listensv6 . TryGetValue ( port , out ctrlnow ) && ctrlnow == ctrl )
475
+ {
476
+ listensv6 . Remove ( port ) ;
477
+ }
478
+ }
479
+ server . Stop ( ) ;
480
+ } ) . Start ( ) ;
433
481
}
434
482
435
483
public void Stop ( int port )
@@ -445,6 +493,15 @@ public void Stop(int port)
445
493
listens . Remove ( port ) ;
446
494
}
447
495
}
496
+ lock ( listensv6 )
497
+ {
498
+ Control ctrl ;
499
+ if ( listensv6 . TryGetValue ( port , out ctrl ) )
500
+ {
501
+ ctrl . running = false ;
502
+ listensv6 . Remove ( port ) ;
503
+ }
504
+ }
448
505
}
449
506
450
507
public NetHandler Connect ( string hostport , int timeout )
@@ -533,8 +590,8 @@ public void Dispose()
533
590
public void Close ( )
534
591
{
535
592
Dispose ( ) ;
536
- }
537
-
593
+ }
594
+
538
595
#region 连接
539
596
private void ConnectImpl ( string host , int port , int timeout , Action < NetHandler , Exception > callback )
540
597
{
@@ -604,9 +661,9 @@ private void ConnectImpl(string host, int port, int timeout, Action<NetHandler,
604
661
callback ( null , e ) ;
605
662
}
606
663
} , null ) ;
607
- }
664
+ }
608
665
#endregion
609
-
666
+
610
667
private void SendQueue ( NetHandlerImpl handler )
611
668
{
612
669
lock ( workqueue )
@@ -625,7 +682,7 @@ private void SendQueue(NetHandlerImpl handler)
625
682
Interlocked . Decrement ( ref workcount ) ;
626
683
return ;
627
684
}
628
- new Thread ( delegate ( )
685
+ new Thread ( delegate ( )
629
686
{
630
687
Thread . CurrentThread . Name = "Network Write" ;
631
688
while ( running )
@@ -671,27 +728,30 @@ private void SendQueue(NetHandlerImpl handler)
671
728
}
672
729
}
673
730
} ) . Start ( ) ;
674
- }
675
-
731
+ }
732
+
676
733
#region 网络连接的具体类
677
734
private class NetHandlerImpl : NetHandler
678
735
{
679
736
public readonly Socket Socket ;
680
737
681
738
public readonly ByteBuffer buffer = new ByteBuffer ( ) ;
682
739
private readonly NetManager manager ;
740
+ private int closed ;
683
741
private Request request ;
684
742
685
743
public NetHandlerImpl ( AddressFamily family , NetManager manager )
686
744
{
687
745
this . manager = manager ;
746
+ this . closed = 0 ;
688
747
Socket = new Socket ( family , SocketType . Stream , ProtocolType . Tcp ) ;
689
748
Socket . SetSocketOption ( SocketOptionLevel . Socket , SocketOptionName . Linger , new LingerOption ( false , 0 ) ) ;
690
749
}
691
750
692
751
public NetHandlerImpl ( Socket socket , NetManager manager )
693
752
{
694
753
this . manager = manager ;
754
+ this . closed = 0 ;
695
755
Socket = socket ;
696
756
Socket . SetSocketOption ( SocketOptionLevel . Socket , SocketOptionName . Linger , new LingerOption ( false , 0 ) ) ;
697
757
}
@@ -702,7 +762,7 @@ public void OnConnected()
702
762
{
703
763
manager . sockets . Add ( this , true ) ;
704
764
}
705
- new Thread ( delegate ( )
765
+ new Thread ( delegate ( )
706
766
{
707
767
Thread . CurrentThread . Name = "Network Read" ;
708
768
byte [ ] bytes = new byte [ 64 * 1024 ] ;
@@ -795,7 +855,8 @@ public void OnConnected()
795
855
796
856
public override void Close ( )
797
857
{
798
- Socket . Close ( ) ;
858
+ if ( Interlocked . CompareExchange ( ref closed , 1 , 0 ) != 0 )
859
+ return ;
799
860
lock ( manager . sockets )
800
861
{
801
862
manager . sockets . Remove ( this ) ;
@@ -805,12 +866,14 @@ public override void Close()
805
866
Loop . Run ( ( ) =>
806
867
{
807
868
if ( manager . settings . events . close != null )
808
- {
809
869
manager . settings . events . close ( this ) ;
810
- manager . settings . events . close = null ;
811
- }
870
+ Socket . Close ( ) ;
812
871
} ) ;
813
872
}
873
+ else
874
+ {
875
+ Socket . Close ( ) ;
876
+ }
814
877
}
815
878
816
879
public override bool Send ( BufferSegment seg )
@@ -948,7 +1011,7 @@ private void OnReceive(byte[] bytes, int length)
948
1011
size = length - offset ;
949
1012
Request old = request ;
950
1013
request = manager . NewRequest ( ) ;
951
- Loop . Run ( delegate ( )
1014
+ Loop . Run ( delegate ( )
952
1015
{
953
1016
if ( manager . settings . events . request != null )
954
1017
{
@@ -961,18 +1024,22 @@ private void OnReceive(byte[] bytes, int length)
961
1024
}
962
1025
catch ( Exception e )
963
1026
{
964
- Socket . Close ( ) ;
965
1027
if ( manager . settings . events . close != null )
966
1028
{
967
- Loop . Run ( delegate ( )
1029
+ Loop . Run ( delegate ( )
968
1030
{
969
1031
if ( manager . settings . events . close != null )
970
1032
manager . settings . events . close ( this ) ;
1033
+ Socket . Close ( ) ;
971
1034
} ) ;
972
1035
}
1036
+ else
1037
+ {
1038
+ Socket . Close ( ) ;
1039
+ }
973
1040
if ( manager . settings . events . exception != null )
974
1041
{
975
- Loop . Run ( delegate ( )
1042
+ Loop . Run ( delegate ( )
976
1043
{
977
1044
if ( manager . settings . events . exception != null )
978
1045
manager . settings . events . exception ( this , e ) ;
@@ -983,9 +1050,9 @@ private void OnReceive(byte[] bytes, int length)
983
1050
}
984
1051
985
1052
protected abstract Request NewRequest ( ) ;
986
- protected abstract void ReleaseRequest ( Request request ) ;
1053
+ protected abstract void ReleaseRequest ( Request request ) ;
987
1054
#endregion
988
-
1055
+
989
1056
#region 主循环调用
990
1057
private static class Loop
991
1058
{
@@ -1115,7 +1182,7 @@ void OnApplicationQuit()
1115
1182
}
1116
1183
}
1117
1184
}
1118
- }
1185
+ }
1119
1186
#endregion
1120
1187
}
1121
1188
0 commit comments