Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f14df31

Browse files
Add: async connection request handling and support for custom kick and refusal data
1 parent 1512fb7 commit f14df31

File tree

7 files changed

+104
-37
lines changed

7 files changed

+104
-37
lines changed

‎Netick/Editor/Netick.CodeGen.dll‎

0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.

‎Netick/Runtime/Netick.Unity.dll‎

512 Bytes
Binary file not shown.

‎Netick/Runtime/Netick.dll‎

3.5 KB
Binary file not shown.

‎Transport/LiteNetLib Transport/LiteNetLibTransport.cs‎

Lines changed: 103 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,88 @@
1-
using LiteNetLib;
2-
using LiteNetLib.Utils;
1+
using System;
32
using System.Collections.Generic;
4-
using UnityEngine;
53
using System.Net;
64
using System.Net.Sockets;
7-
using System;
8-
using Netick.Unity;
5+
using LiteNetLib;
6+
using LiteNetLib.Utils;
97

108
namespace Netick.Transport
119
{
1210
public class LiteNetLibTransport : NetworkTransport, INetEventListener
1311
{
12+
private class LNLRequest : IConnectionRequest
13+
{
14+
public LiteNetLibTransport Transport;
15+
public ConnectionRequest Request;
16+
public IEndPoint Source => Request.RemoteEndPoint.ToNetickEndPoint();
17+
18+
public LNLRequest(LiteNetLibTransport transport)
19+
{
20+
Transport = transport;
21+
}
22+
23+
public void Accept()
24+
{
25+
if (Request == null)
26+
return;
27+
28+
Request?.Accept();
29+
Transport._freeRequests.Enqueue(this);
30+
Request = null;
31+
}
32+
33+
public void Refuse(ReadOnlySpan<byte> refusalData)
34+
{
35+
if (Request == null)
36+
return;
37+
38+
if (Transport._bytesBuffer.Length < refusalData.Length)
39+
Transport._bytesBuffer = new byte[refusalData.Length];
40+
if (refusalData.Length > 0)
41+
refusalData.CopyTo(Transport._bytesBuffer);
42+
43+
Request?.Reject(Transport._bytesBuffer, 0, refusalData.Length);
44+
Transport._freeRequests.Enqueue(this);
45+
Request = null;
46+
}
47+
}
48+
1449
public class LNLConnection : TransportConnection
1550
{
16-
public LiteNetLibTransport Transport;
17-
public NetPeer LNLPeer;
18-
public override IEndPoint EndPoint => LNLPeer.EndPoint.ToNetickEndPoint();
19-
public override int Mtu => LNLPeer.Mtu;
51+
public LiteNetLibTransport Transport;
52+
public NetPeer LNLPeer;
53+
public override IEndPoint EndPoint => LNLPeer.EndPoint.ToNetickEndPoint();
54+
public override int Mtu => LNLPeer.Mtu;
55+
2056
public LNLConnection(LiteNetLibTransport transport)
2157
{
2258
Transport = transport;
2359
}
60+
2461
public unsafe override void Send(IntPtr ptr, int length) => LNLPeer.Send(new ReadOnlySpan<byte>(ptr.ToPointer(), length), DeliveryMethod.Unreliable);
2562
public unsafe override void SendUserData(IntPtr ptr, int length, TransportDeliveryMethod method) => LNLPeer.Send(new ReadOnlySpan<byte>(ptr.ToPointer(), length), method == TransportDeliveryMethod.Unreliable ? DeliveryMethod.Unreliable : DeliveryMethod.ReliableOrdered);
2663
}
2764

2865
private LiteNetLibTransportProvider _provider;
2966
private NetManager _netManager;
30-
private NetDataWriter _writer = new NetDataWriter();
31-
private BitBuffer _buffer;
32-
private byte[] _connectionBytes = new byte[1000];
67+
private NetDataWriter _writer = new NetDataWriter();
68+
private BitBuffer _bitBuffer;
69+
private byte[] _bytesBuffer = new byte[1024];
3370
private int _port;
34-
private Dictionary<NetPeer, LNLConnection> _clients;
71+
private Dictionary<NetPeer, LNLConnection> _connections;
3572
private Queue<LNLConnection> _freeClients;
36-
73+
private Queue<LNLRequest> _freeRequests;
74+
3775
public LiteNetLibTransport(LiteNetLibTransportProvider provider)
3876
{
3977
this._provider = provider;
4078
}
4179

4280
public override void Init()
4381
{
44-
_clients = new(Engine.Config.MaxPlayers);
82+
_connections = new(Engine.Config.MaxPlayers);
4583
_freeClients = new(Engine.Config.MaxPlayers);
46-
_buffer = new BitBuffer(createChunks: false);
84+
_freeRequests = new(Engine.Config.MaxPlayers);
85+
_bitBuffer = new BitBuffer(createChunks: false);
4786
_netManager = new NetManager(this) { AutoRecycle = true };
4887
_netManager.DisconnectTimeout = (int)(_provider.DisconnectTimeout * 1000);
4988
_netManager.ReconnectDelay = (int)(_provider.ReconnectInterval * 1000);
@@ -52,6 +91,9 @@ public override void Init()
5291

5392
for (int i = 0; i < Engine.Config.MaxPlayers; i++)
5493
_freeClients.Enqueue(new LNLConnection(this));
94+
95+
for (int i = 0; i < Engine.Config.MaxPlayers; i++)
96+
_freeRequests.Enqueue(new LNLRequest(this));
5597
}
5698

5799
public override void PollEvents() => _netManager.PollEvents();
@@ -98,6 +140,15 @@ public override void Disconnect(TransportConnection connection)
98140
_netManager.DisconnectPeer(((LNLConnection)connection).LNLPeer);
99141
}
100142

143+
public override void DisconnectWithData(TransportConnection connection, ReadOnlySpan<byte> data)
144+
{
145+
if (_bytesBuffer.Length < data.Length)
146+
_bytesBuffer = new byte[data.Length];
147+
148+
data.CopyTo(_bytesBuffer);
149+
_netManager.DisconnectPeer(((LNLConnection)connection).LNLPeer, _bytesBuffer, 0, data.Length);
150+
}
151+
101152
void INetEventListener.OnConnectionRequest(ConnectionRequest request)
102153
{
103154
if (_freeClients.Count == 0)
@@ -106,14 +157,19 @@ void INetEventListener.OnConnectionRequest(ConnectionRequest request)
106157
return;
107158
}
108159

109-
int len = request.Data.AvailableBytes;
110-
request.Data.GetBytes(_connectionBytes, 0, len);
111-
bool accepted = NetworkPeer.OnConnectRequest(_connectionBytes, len, request.RemoteEndPoint.ToNetickEndPoint());
160+
var r = _freeRequests.Count > 0 ? _freeRequests.Dequeue() : new LNLRequest(this);
161+
r.Request = request;
112162

113-
if (accepted)
114-
request.Accept();
163+
if (request.Data.AvailableBytes > 0)
164+
{
165+
Span<byte> kickData = stackalloc byte[request.Data.AvailableBytes];
166+
request.Data.GetRemainingBytesSegment().AsSpan().CopyTo(kickData);
167+
NetworkPeer.OnConnectRequest(r, kickData);
168+
}
115169
else
116-
request.Reject();
170+
{
171+
NetworkPeer.OnConnectRequest(r);
172+
}
117173
}
118174

119175
void INetEventListener.OnPeerConnected(NetPeer peer)
@@ -125,17 +181,28 @@ void INetEventListener.OnPeerConnected(NetPeer peer)
125181
}
126182
var connection = _freeClients.Dequeue();
127183
connection.LNLPeer = peer;
128-
_clients. Add(peer, connection);
184+
_connections. Add(peer, connection);
129185
NetworkPeer. OnConnected(connection);
130186
}
131187

132-
void INetEventListener.OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
188+
unsafevoid INetEventListener.OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
133189
{
134-
if (!Engine.IsServer)
190+
var dataLength = disconnectInfo.AdditionalData != null ? disconnectInfo.AdditionalData.AvailableBytes : 0;
191+
Span<byte> kickData = stackalloc byte[dataLength];
192+
if (dataLength > 0)
193+
disconnectInfo.AdditionalData.GetRemainingBytesSegment().AsSpan().CopyTo(kickData);
194+
195+
if (Engine.IsClient)
135196
{
136197
if (disconnectInfo.Reason == DisconnectReason.ConnectionRejected)
137198
{
138-
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused);
199+
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused, kickData);
200+
return;
201+
}
202+
203+
if (disconnectInfo.Reason == DisconnectReason.ConnectionRejected)
204+
{
205+
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused, kickData);
139206
return;
140207
}
141208

@@ -147,39 +214,39 @@ void INetEventListener.OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnec
147214

148215
if (peer == null)
149216
{
150-
Debug.Log($"LiteNetLib Network Error: {disconnectInfo.Reason}");
151-
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused);
217+
UnityEngine.Debug.Log($"LiteNetLib Network Error: {disconnectInfo.Reason}");
218+
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused,kickData);
152219
return;
153220
}
154221
}
155222

156223
if (peer == null)
157224
return;
158225

159-
if (_clients.ContainsKey(peer))
226+
if (_connections.ContainsKey(peer))
160227
{
161228
TransportDisconnectReason reason = disconnectInfo.Reason == DisconnectReason.Timeout ? TransportDisconnectReason.Timeout : TransportDisconnectReason.Shutdown;
162-
NetworkPeer. OnDisconnected(_clients[peer], reason);
163-
_freeClients.Enqueue(_clients[peer]);
164-
_clients.Remove(peer);
229+
NetworkPeer. OnDisconnected(_connections[peer], reason,kickData);
230+
_freeClients.Enqueue(_connections[peer]);
231+
_connections.Remove(peer);
165232
}
166233
}
167234

168235
unsafe void INetEventListener.OnNetworkReceive(NetPeer peer, NetPacketReader reader, byte channel, DeliveryMethod deliveryMethod)
169236
{
170-
if (!_clients.TryGetValue(peer, out var c))
237+
if (!_connections.TryGetValue(peer, out var c))
171238
return;
172239

173240
fixed (byte* ptr = reader.RawData)
174241
{
175-
_buffer. SetFrom(ptr + reader.Position, reader.AvailableBytes, reader.RawData.Length);
176-
NetworkPeer.Receive(c, _buffer);
242+
_bitBuffer. SetFrom(ptr + reader.Position, reader.AvailableBytes, reader.RawData.Length);
243+
NetworkPeer.Receive(c, _bitBuffer);
177244
}
178245
}
179246

180247
void INetEventListener.OnNetworkError(IPEndPoint endPoint, SocketError socketError)
181248
{
182-
Debug.Log("LiteNetLib Network Error: " + socketError);
249+
UnityEngine.Debug.Log("LiteNetLib Network Error: " + socketError);
183250
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused);
184251
}
185252

‎package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "com.karrar.netick",
3-
"version": "0.15.3",
3+
"version": "0.15.5",
44
"displayName": "Netick",
55
"description": "A networking solution for Unity",
66
"unity": "2021.3",

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /