Added settings to LiteNetLibTransportProvider. In addition, made general improvements and fixed a bug when sending user data with a byte size bigger than _bytes size.

This commit is contained in:
Karrar
2024-08-27 09:48:24 +03:00
parent b62d5d40e4
commit 0a8e405e62
9 changed files with 57 additions and 86 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -12,3 +12,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 5b519f64e02c1ed48a5a00039c4f6c4e, type: 3} m_Script: {fileID: 11500000, guid: 5b519f64e02c1ed48a5a00039c4f6c4e, type: 3}
m_Name: LiteNetLibTransportProvider m_Name: LiteNetLibTransportProvider
m_EditorClassIdentifier: m_EditorClassIdentifier:
DisconnectTimeout: 5
ReconnectInterval: 0.5
MaxConnectAttempts: 10
UpdateInterval: 0.015

View File

@@ -5,7 +5,6 @@ using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using System.Net; using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
using System.Runtime;
using System; using System;
using Netick.Unity; using Netick.Unity;
@@ -14,7 +13,16 @@ namespace Netick.Transport
[CreateAssetMenu(fileName = "LiteNetLibTransportProvider", menuName = "Netick/Transport/LiteNetLibTransportProvider", order = 1)] [CreateAssetMenu(fileName = "LiteNetLibTransportProvider", menuName = "Netick/Transport/LiteNetLibTransportProvider", order = 1)]
public class LiteNetLibTransportProvider : NetworkTransportProvider public class LiteNetLibTransportProvider : NetworkTransportProvider
{ {
public override NetworkTransport MakeTransportInstance() => new LiteNetLibTransport(); [Tooltip("Time duration (in seconds) until a connection is dropped when no packets were received.")]
public float DisconnectTimeout = 5;
[Tooltip("Time interval (in seconds) between connection attempts.")]
public float ReconnectInterval = 0.5f;
[Tooltip("Max number of connect attempts.")]
public int MaxConnectAttempts = 10;
[Tooltip("LiteNetLib internal logic update interval (in seconds).")]
public float UpdateInterval = 0.015f;
public override NetworkTransport MakeTransportInstance() => new LiteNetLibTransport(this);
} }
public class LiteNetLibTransport : NetworkTransport, INetEventListener public class LiteNetLibTransport : NetworkTransport, INetEventListener
@@ -44,36 +52,45 @@ namespace Netick.Transport
private unsafe void SendLNL(byte* ptr, int length, DeliveryMethod deliveryMethod) private unsafe void SendLNL(byte* ptr, int length, DeliveryMethod deliveryMethod)
{ {
if (Transport._bytes.Length < length)
Transport._bytes = new byte[length];
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
Transport._bytes[i] = ptr[i]; Transport._bytes[i] = ptr[i];
LNLPeer.Send(Transport._bytes, 0, length, deliveryMethod); LNLPeer.Send(Transport._bytes, 0, length, deliveryMethod);
} }
} }
private LiteNetLibTransportProvider _provider;
private NetManager _netManager; private NetManager _netManager;
private BitBuffer _buffer; private BitBuffer _buffer;
private readonly byte[] _bytes = new byte[2048]; private byte[] _bytes = new byte[2048];
private readonly byte[] _connectionBytes = new byte[200]; private readonly byte[] _connectionBytes = new byte[200];
private int _port; private int _port;
private bool _isServer = false; private Dictionary<NetPeer, LNLConnection> _clients = new Dictionary<NetPeer, LNLConnection>();
private Dictionary<NetPeer, LNLConnection> _clients = new Dictionary<NetPeer, LNLConnection>(); private Queue<LNLConnection> _freeClients = new Queue<LNLConnection>();
private Queue<LNLConnection> _freeClients = new Queue<LNLConnection>();
// LAN Matchmaking // LAN Discovery
private List<Session> _sessions = new List<Session>(); private List<Session> _sessions = new List<Session>();
private NetDataWriter _writer = new NetDataWriter(); private NetDataWriter _writer = new NetDataWriter();
private string _machineName; private string _machineName;
public LiteNetLibTransport(LiteNetLibTransportProvider provider)
{
this._provider = provider;
}
public override void Init() public override void Init()
{ {
_buffer = new BitBuffer(createChunks: false); _buffer = new BitBuffer(createChunks: false);
// _bufferSize = 875 * 4; _netManager = new NetManager((INetEventListener)this) { AutoRecycle = true };
_machineName = Environment.MachineName;
_netManager = new NetManager((INetEventListener)this) { AutoRecycle = true }; _netManager.DisconnectTimeout = (int)( _provider.DisconnectTimeout * 1000);
_machineName = Environment.MachineName; _netManager.ReconnectDelay = (int)(_provider.ReconnectInterval * 1000);
//_netManager.DisconnectTimeout = 1000; _netManager.MaxConnectAttempts = _provider.MaxConnectAttempts;
_netManager.UpdateTime = (int)(_provider.UpdateInterval * 1000);
for (int i = 0; i < Engine.Config.MaxPlayers; i++) for (int i = 0; i < Engine.Config.MaxPlayers; i++)
_freeClients.Enqueue(new LNLConnection(this)); _freeClients.Enqueue(new LNLConnection(this));
@@ -95,14 +112,12 @@ namespace Netick.Transport
{ {
_netManager.UnconnectedMessagesEnabled = true; _netManager.UnconnectedMessagesEnabled = true;
_netManager.Start(); _netManager.Start();
_isServer = false;
} }
else else
{ {
_netManager.BroadcastReceiveEnabled = true; _netManager.BroadcastReceiveEnabled = true;
_netManager.Start(port); _netManager.Start(port);
_isServer = true;
} }
_port = port; _port = port;
@@ -124,12 +139,10 @@ namespace Netick.Transport
} }
else else
{ {
_writer.Reset(); _writer. Reset();
_writer.Put(connectionData, 0, connectionDataLen); _writer. Put(connectionData, 0, connectionDataLen);
_netManager.Connect(address, port, _writer); _netManager.Connect(address, port, _writer);
} }
} }
public override void Disconnect(TransportConnection connection) public override void Disconnect(TransportConnection connection)
@@ -137,24 +150,6 @@ namespace Netick.Transport
_netManager.DisconnectPeer(((LNLConnection)connection).LNLPeer); _netManager.DisconnectPeer(((LNLConnection)connection).LNLPeer);
} }
//public override void HostMatch(string name)
//{
//}
//public override void UpdateMatchList()
//{
// if (!_netManager.IsRunning)
// _netManager.Start();
// _sessions.Clear();
// _writer.Reset();
// _writer.Put(NetickConfig.LAN_DISCOVERY);
// _netManager.SendBroadcast(_writer, _port);
//}
/// ////////////////////////////////////////////
void INetEventListener.OnConnectionRequest(ConnectionRequest request) void INetEventListener.OnConnectionRequest(ConnectionRequest request)
{ {
if (_clients.Count >= Engine.Config.MaxPlayers) if (_clients.Count >= Engine.Config.MaxPlayers)
@@ -163,7 +158,7 @@ namespace Netick.Transport
return; return;
} }
int len = request.Data.AvailableBytes; int len = request.Data.AvailableBytes;
request.Data.GetBytes(_connectionBytes, 0, len); request.Data.GetBytes(_connectionBytes, 0, len);
bool accepted = NetworkPeer.OnConnectRequest(_connectionBytes, len, request.RemoteEndPoint.ToNetickEndPoint()); bool accepted = NetworkPeer.OnConnectRequest(_connectionBytes, len, request.RemoteEndPoint.ToNetickEndPoint());
@@ -175,26 +170,32 @@ namespace Netick.Transport
void INetEventListener.OnPeerConnected(NetPeer peer) void INetEventListener.OnPeerConnected(NetPeer peer)
{ {
var connection = _freeClients.Dequeue(); var connection = _freeClients.Dequeue();
connection.LNLPeer = peer; connection.LNLPeer = peer;
_clients.Add(peer, connection); _clients. Add(peer, connection);
NetworkPeer.OnConnected(connection); NetworkPeer.OnConnected(connection);
} }
void INetEventListener.OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo) void INetEventListener.OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
{ {
if (!_isServer) if (!Engine.IsServer)
{ {
if (disconnectInfo.Reason == DisconnectReason.ConnectionRejected || disconnectInfo.Reason == DisconnectReason.ConnectionFailed) if (disconnectInfo.Reason == DisconnectReason.ConnectionRejected)
{ {
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused); NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused);
return; return;
} }
if (disconnectInfo.Reason == DisconnectReason.ConnectionFailed || disconnectInfo.Reason == DisconnectReason.Timeout)
{
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Timeout);
return;
}
if (peer == null) if (peer == null)
{ {
Debug.Log($"ERROR: {disconnectInfo.Reason}"); Debug.Log($"LiteNetLib Network Error: {disconnectInfo.Reason}");
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused); NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused);
return; return;
} }
@@ -210,9 +211,9 @@ namespace Netick.Transport
{ {
TransportDisconnectReason reason = disconnectInfo.Reason == DisconnectReason.Timeout ? TransportDisconnectReason.Timeout : TransportDisconnectReason.Shutdown; TransportDisconnectReason reason = disconnectInfo.Reason == DisconnectReason.Timeout ? TransportDisconnectReason.Timeout : TransportDisconnectReason.Shutdown;
NetworkPeer.OnDisconnected(_clients[peer], reason); NetworkPeer. OnDisconnected(_clients[peer], reason);
_freeClients.Enqueue(_clients[peer]); _freeClients.Enqueue(_clients[peer]);
_clients.Remove(peer); _clients. Remove(peer);
} }
} }
@@ -221,61 +222,27 @@ namespace Netick.Transport
if (_clients.TryGetValue(peer, out var c)) if (_clients.TryGetValue(peer, out var c))
{ {
var len = reader.AvailableBytes; var len = reader.AvailableBytes;
reader.GetBytes(_bytes, 0, reader.AvailableBytes); reader. GetBytes(_bytes, 0, reader.AvailableBytes);
fixed(byte* ptr = _bytes) fixed(byte* ptr = _bytes)
{ {
_buffer.SetFrom(ptr, len, _bytes.Length); _buffer. SetFrom(ptr, len, _bytes.Length);
NetworkPeer.Receive(c, _buffer); NetworkPeer.Receive(c, _buffer);
} }
} }
} }
void INetEventListener.OnNetworkReceiveUnconnected(IPEndPoint remoteEndPoint, NetPacketReader reader, UnconnectedMessageType messageType) void INetEventListener.OnNetworkReceiveUnconnected(IPEndPoint remoteEndPoint, NetPacketReader reader, UnconnectedMessageType messageType)
{ {
//ulong msgType = reader.GetULong();
//if (msgType == NetickConfig.LAN_DISCOVERY_RESPONSE)
//{
// string name = reader.GetString();
// int port = reader.GetInt();
// var newSession = new Session()
// {
// Name = name,
// IP = remoteEndPoint.Address.ToString(),
// Port = port
// };
// if (!_sessions.Contains(newSession))
// _sessions.Add(newSession);
// OnMatchListUpdate(_sessions);
//}
//else if (_isServer && msgType == NetickConfig.LAN_DISCOVERY)
//{
// _writer.Reset();
// _writer.Put(NetickConfig.LAN_DISCOVERY_RESPONSE);
// _writer.Put(_machineName);
// _writer.Put(_port);
// _netManager.SendUnconnectedMessage(_writer, remoteEndPoint);
//}
} }
void INetEventListener.OnNetworkError(IPEndPoint endPoint, SocketError socketError) void INetEventListener.OnNetworkError(IPEndPoint endPoint, SocketError socketError)
{ {
Debug.Log("[S] NetworkError: " + socketError); Debug.Log("LiteNetLib Network Error: " + socketError);
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused); NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused);
} }
void INetEventListener.OnNetworkLatencyUpdate(NetPeer peer, int latency) { } void INetEventListener.OnNetworkLatencyUpdate(NetPeer peer, int latency) { }
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "com.karrar.netick", "name": "com.karrar.netick",
"version": "0.12.22", "version": "0.12.23",
"displayName": "Netick", "displayName": "Netick",
"description": "A networking solution for Unity", "description": "A networking solution for Unity",
"unity": "2021.3", "unity": "2021.3",