5
5
using UnityEngine ;
6
6
using System . Net ;
7
7
using System . Net . Sockets ;
8
- using System . Runtime ;
9
8
using System ;
10
9
using Netick . Unity ;
11
10
@@ -14,7 +13,16 @@ namespace Netick.Transport
14
13
[ CreateAssetMenu ( fileName = "LiteNetLibTransportProvider" , menuName = "Netick/Transport/LiteNetLibTransportProvider" , order = 1 ) ]
15
14
public class LiteNetLibTransportProvider : NetworkTransportProvider
16
15
{
17
- public override NetworkTransport MakeTransportInstance ( ) => new LiteNetLibTransport ( ) ;
16
+ [ Tooltip ( "Time duration (in seconds) until a connection is dropped when no packets were received." ) ]
17
+ public float DisconnectTimeout = 5 ;
18
+ [ Tooltip ( "Time interval (in seconds) between connection attempts." ) ]
19
+ public float ReconnectInterval = 0.5f ;
20
+ [ Tooltip ( "Max number of connect attempts." ) ]
21
+ public int MaxConnectAttempts = 10 ;
22
+ [ Tooltip ( "LiteNetLib internal logic update interval (in seconds)." ) ]
23
+ public float UpdateInterval = 0.015f ;
24
+
25
+ public override NetworkTransport MakeTransportInstance ( ) => new LiteNetLibTransport ( this ) ;
18
26
}
19
27
20
28
public class LiteNetLibTransport : NetworkTransport , INetEventListener
@@ -44,37 +52,46 @@ public unsafe override void SendUserData(IntPtr ptr, int length, TransportDelive
44
52
45
53
private unsafe void SendLNL ( byte * ptr , int length , DeliveryMethod deliveryMethod )
46
54
{
55
+ if ( Transport . _bytes . Length < length )
56
+ Transport . _bytes = new byte [ length ] ;
57
+
47
58
for ( int i = 0 ; i < length ; i ++ )
48
59
Transport . _bytes [ i ] = ptr [ i ] ;
49
60
LNLPeer . Send ( Transport . _bytes , 0 , length , deliveryMethod ) ;
50
61
}
51
62
}
52
63
64
+ private LiteNetLibTransportProvider _provider ;
53
65
private NetManager _netManager ;
54
66
private BitBuffer _buffer ;
55
67
56
- private readonly byte [ ] _bytes = new byte [ 2048 ] ;
68
+ private byte [ ] _bytes = new byte [ 2048 ] ;
57
69
private readonly byte [ ] _connectionBytes = new byte [ 200 ] ;
58
70
59
71
private int _port ;
60
- private bool _isServer = false ;
61
- private Dictionary < NetPeer , LNLConnection > _clients = new Dictionary < NetPeer , LNLConnection > ( ) ;
62
- private Queue < LNLConnection > _freeClients = new Queue < LNLConnection > ( ) ;
72
+ private Dictionary < NetPeer , LNLConnection > _clients = new Dictionary < NetPeer , LNLConnection > ( ) ;
73
+ private Queue < LNLConnection > _freeClients = new Queue < LNLConnection > ( ) ;
63
74
64
- // LAN Matchmaking
65
- private List < Session > _sessions = new List < Session > ( ) ;
66
- private NetDataWriter _writer = new NetDataWriter ( ) ;
75
+ // LAN Discovery
76
+ private List < Session > _sessions = new List < Session > ( ) ;
77
+ private NetDataWriter _writer = new NetDataWriter ( ) ;
67
78
private string _machineName ;
68
79
69
- public override void Init ( )
80
+ public LiteNetLibTransport ( LiteNetLibTransportProvider provider )
70
81
{
71
- _buffer = new BitBuffer ( createChunks : false ) ;
72
- // _bufferSize = 875 * 4;
73
-
74
- _netManager = new NetManager ( ( INetEventListener ) this ) { AutoRecycle = true } ;
75
- _machineName = Environment . MachineName ;
76
- //_netManager.DisconnectTimeout = 1000;
82
+ this . _provider = provider ;
83
+ }
77
84
85
+ public override void Init ( )
86
+ {
87
+ _buffer = new BitBuffer ( createChunks : false ) ;
88
+ _netManager = new NetManager ( ( INetEventListener ) this ) { AutoRecycle = true } ;
89
+ _machineName = Environment . MachineName ;
90
+ _netManager . DisconnectTimeout = ( int ) ( _provider . DisconnectTimeout * 1000 ) ;
91
+ _netManager . ReconnectDelay = ( int ) ( _provider . ReconnectInterval * 1000 ) ;
92
+ _netManager . MaxConnectAttempts = _provider . MaxConnectAttempts ;
93
+ _netManager . UpdateTime = ( int ) ( _provider . UpdateInterval * 1000 ) ;
94
+
78
95
for ( int i = 0 ; i < Engine . Config . MaxPlayers ; i ++ )
79
96
_freeClients . Enqueue ( new LNLConnection ( this ) ) ;
80
97
}
@@ -95,14 +112,12 @@ public override void Run(RunMode mode, int port)
95
112
{
96
113
_netManager . UnconnectedMessagesEnabled = true ;
97
114
_netManager . Start ( ) ;
98
- _isServer = false ;
99
115
}
100
116
101
117
else
102
118
{
103
119
_netManager . BroadcastReceiveEnabled = true ;
104
120
_netManager . Start ( port ) ;
105
- _isServer = true ;
106
121
}
107
122
108
123
_port = port ;
@@ -124,37 +139,17 @@ public override void Connect(string address, int port, byte[] connectionData, in
124
139
}
125
140
else
126
141
{
127
- _writer . Reset ( ) ;
128
- _writer . Put ( connectionData , 0 , connectionDataLen ) ;
142
+ _writer . Reset ( ) ;
143
+ _writer . Put ( connectionData , 0 , connectionDataLen ) ;
129
144
_netManager . Connect ( address , port , _writer ) ;
130
145
}
131
-
132
-
133
146
}
134
147
135
148
public override void Disconnect ( TransportConnection connection )
136
149
{
137
150
_netManager . DisconnectPeer ( ( ( LNLConnection ) connection ) . LNLPeer ) ;
138
151
}
139
152
140
- //public override void HostMatch(string name)
141
- //{
142
-
143
- //}
144
-
145
- //public override void UpdateMatchList()
146
- //{
147
- // if (!_netManager.IsRunning)
148
- // _netManager.Start();
149
-
150
- // _sessions.Clear();
151
- // _writer.Reset();
152
- // _writer.Put(NetickConfig.LAN_DISCOVERY);
153
- // _netManager.SendBroadcast(_writer, _port);
154
- //}
155
-
156
- /// ////////////////////////////////////////////
157
-
158
153
void INetEventListener . OnConnectionRequest ( ConnectionRequest request )
159
154
{
160
155
if ( _clients . Count >= Engine . Config . MaxPlayers )
@@ -163,7 +158,7 @@ void INetEventListener.OnConnectionRequest(ConnectionRequest request)
163
158
return ;
164
159
}
165
160
166
- int len = request . Data . AvailableBytes ;
161
+ int len = request . Data . AvailableBytes ;
167
162
request . Data . GetBytes ( _connectionBytes , 0 , len ) ;
168
163
bool accepted = NetworkPeer . OnConnectRequest ( _connectionBytes , len , request . RemoteEndPoint . ToNetickEndPoint ( ) ) ;
169
164
@@ -175,26 +170,32 @@ void INetEventListener.OnConnectionRequest(ConnectionRequest request)
175
170
176
171
void INetEventListener . OnPeerConnected ( NetPeer peer )
177
172
{
178
- var connection = _freeClients . Dequeue ( ) ;
173
+ var connection = _freeClients . Dequeue ( ) ;
179
174
connection . LNLPeer = peer ;
180
175
181
- _clients . Add ( peer , connection ) ;
176
+ _clients . Add ( peer , connection ) ;
182
177
NetworkPeer . OnConnected ( connection ) ;
183
178
}
184
179
185
180
void INetEventListener . OnPeerDisconnected ( NetPeer peer , DisconnectInfo disconnectInfo )
186
181
{
187
- if ( ! _isServer )
182
+ if ( ! Engine . IsServer )
188
183
{
189
- if ( disconnectInfo . Reason == DisconnectReason . ConnectionRejected || disconnectInfo . Reason == DisconnectReason . ConnectionFailed )
184
+ if ( disconnectInfo . Reason == DisconnectReason . ConnectionRejected )
190
185
{
191
186
NetworkPeer . OnConnectFailed ( ConnectionFailedReason . Refused ) ;
192
187
return ;
193
188
}
194
189
190
+ if ( disconnectInfo . Reason == DisconnectReason . ConnectionFailed || disconnectInfo . Reason == DisconnectReason . Timeout )
191
+ {
192
+ NetworkPeer . OnConnectFailed ( ConnectionFailedReason . Timeout ) ;
193
+ return ;
194
+ }
195
+
195
196
if ( peer == null )
196
197
{
197
- Debug . Log ( $ "ERROR : { disconnectInfo . Reason } ") ;
198
+ Debug . Log ( $ "LiteNetLib Network Error : { disconnectInfo . Reason } ") ;
198
199
NetworkPeer . OnConnectFailed ( ConnectionFailedReason . Refused ) ;
199
200
return ;
200
201
}
@@ -210,9 +211,9 @@ void INetEventListener.OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnec
210
211
{
211
212
TransportDisconnectReason reason = disconnectInfo . Reason == DisconnectReason . Timeout ? TransportDisconnectReason . Timeout : TransportDisconnectReason . Shutdown ;
212
213
213
- NetworkPeer . OnDisconnected ( _clients [ peer ] , reason ) ;
214
+ NetworkPeer . OnDisconnected ( _clients [ peer ] , reason ) ;
214
215
_freeClients . Enqueue ( _clients [ peer ] ) ;
215
- _clients . Remove ( peer ) ;
216
+ _clients . Remove ( peer ) ;
216
217
}
217
218
}
218
219
@@ -221,61 +222,27 @@ unsafe void INetEventListener.OnNetworkReceive(NetPeer peer, NetPacketReader rea
221
222
if ( _clients . TryGetValue ( peer , out var c ) )
222
223
{
223
224
var len = reader . AvailableBytes ;
224
- reader . GetBytes ( _bytes , 0 , reader . AvailableBytes ) ;
225
+ reader . GetBytes ( _bytes , 0 , reader . AvailableBytes ) ;
225
226
226
227
fixed( byte * ptr = _bytes )
227
228
{
228
- _buffer . SetFrom ( ptr , len , _bytes . Length ) ;
229
+ _buffer . SetFrom ( ptr , len , _bytes . Length ) ;
229
230
NetworkPeer . Receive ( c , _buffer ) ;
230
231
}
231
232
}
232
233
}
233
234
234
-
235
235
void INetEventListener . OnNetworkReceiveUnconnected ( IPEndPoint remoteEndPoint , NetPacketReader reader , UnconnectedMessageType messageType )
236
236
{
237
- //ulong msgType = reader.GetULong();
238
-
239
- //if (msgType == NetickConfig.LAN_DISCOVERY_RESPONSE)
240
- //{
241
- // string name = reader.GetString();
242
- // int port = reader.GetInt();
243
-
244
- // var newSession = new Session()
245
- // {
246
- // Name = name,
247
- // IP = remoteEndPoint.Address.ToString(),
248
- // Port = port
249
- // };
250
-
251
- // if (!_sessions.Contains(newSession))
252
- // _sessions.Add(newSession);
253
-
254
- // OnMatchListUpdate(_sessions);
255
- //}
256
-
257
- //else if (_isServer && msgType == NetickConfig.LAN_DISCOVERY)
258
- //{
259
- // _writer.Reset();
260
- // _writer.Put(NetickConfig.LAN_DISCOVERY_RESPONSE);
261
- // _writer.Put(_machineName);
262
- // _writer.Put(_port);
263
-
264
- // _netManager.SendUnconnectedMessage(_writer, remoteEndPoint);
265
- //}
266
237
}
267
238
268
-
269
239
void INetEventListener . OnNetworkError ( IPEndPoint endPoint , SocketError socketError )
270
240
{
271
- Debug . Log ( "[S] NetworkError : " + socketError ) ;
241
+ Debug . Log ( "LiteNetLib Network Error : " + socketError ) ;
272
242
NetworkPeer . OnConnectFailed ( ConnectionFailedReason . Refused ) ;
273
243
}
274
244
275
245
void INetEventListener . OnNetworkLatencyUpdate ( NetPeer peer , int latency ) { }
276
-
277
-
278
-
279
246
}
280
247
281
248
0 commit comments