Skip to content

Commit 822a801

Browse files
committed
Completed custom transport system
1 parent 6aef964 commit 822a801

18 files changed

+322
-322
lines changed

MLAPI/Data/Channel.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using UnityEngine.Networking;
32

43
namespace MLAPI.Data
54
{
@@ -16,7 +15,7 @@ public class Channel
1615
/// <summary>
1716
/// The Transport QOS type
1817
/// </summary>
19-
public QosType Type;
18+
public ChannelType Type;
2019
/// <summary>
2120
/// Wheter or not the channel should be encrypted
2221
/// </summary>

MLAPI/Data/NetworkConfig.cs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using MLAPI.NetworkingManagerComponents.Binary;
1+
using MLAPI.Data.Transports.UNET;
2+
using MLAPI.NetworkingManagerComponents.Binary;
23
using System;
34
using System.Collections.Generic;
45
using System.Security.Cryptography;
@@ -19,15 +20,7 @@ public class NetworkConfig
1920
/// <summary>
2021
/// The transport hosts the sever uses
2122
/// </summary>
22-
public List<TransportHost> ServerTransports = new List<TransportHost>()
23-
{
24-
new TransportHost()
25-
{
26-
Name = "UDP Socket",
27-
Port = 7777,
28-
Websockets = false
29-
}
30-
};
23+
public IUDPTransport NetworkTransport = new UnetTransport();
3124
/// <summary>
3225
/// Channels used by the NetworkedTransport
3326
/// </summary>

MLAPI/Data/Transports/ChannelType.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ public enum ChannelType
1010
ReliableSequenced,
1111
StateUpdate,
1212
ReliableStateUpdate,
13-
AllCostDelivery
13+
AllCostDelivery,
14+
UnreliableFragmentedSequenced,
15+
ReliableFragmentedSequenced
1416
}
1517
}

MLAPI/Data/Transports/IUDPTransport.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,22 @@
22
{
33
public interface IUDPTransport
44
{
5-
void QueueMessageForSending(uint clientId, ref byte[] dataBuffer, int dataSize, int channelId, bool skipqueue, out byte error);
5+
ChannelType InternalChannel { get; }
6+
uint ServerNetId { get; }
7+
uint HostDummyId { get; }
8+
uint InvalidDummyId { get; }
9+
void QueueMessageForSending(uint clientId, ref byte[] dataBuffer, int dataSize, int channelId, bool skipQueue, out byte error);
610
void SendQueue(uint clientId, out byte error);
711
NetEventType PollReceive(out uint clientId, out int channelId, ref byte[] data, int bufferSize, out int receivedSize, out byte error);
8-
int Connect(string address, int port, object settings, bool websocket, out byte error);
9-
int RegisterServerListenSocket(object settings, bool websocket);
10-
void Disconnect(uint clientId);
12+
int AddChannel(ChannelType type, object settings);
13+
void Connect(string address, int port, object settings, out byte error);
14+
void RegisterServerListenSocket(object settings);
15+
void DisconnectClient(uint clientId);
16+
void DisconnectFromServer();
1117
int GetCurrentRTT(uint clientId, out byte error);
1218
int GetRemoteDelayTimeMS(uint clientId, int remoteTimestamp, out byte error);
1319
int GetNetworkTimestamp();
20+
object GetSettings();
1421
void Shutdown();
1522
}
1623
}

MLAPI/Data/NetId.cs renamed to MLAPI/Data/Transports/UNET/NetId.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using MLAPI.MonoBehaviours.Core;
2-
3-
namespace MLAPI.Data
1+
namespace MLAPI.Data.Transports.UNET
42
{
53
/// <summary>
64
/// Represents a ClientId structure
@@ -37,17 +35,6 @@ public bool IsInvalid()
3735
return Meta == 2;
3836
}
3937
/// <summary>
40-
/// Static ServerNetId for comparison
41-
/// </summary>
42-
/// <value>The server net identifier.</value>
43-
public static NetId ServerNetId
44-
{
45-
get
46-
{
47-
return new NetId((byte)NetworkingManager.singleton.serverHostId, (ushort)NetworkingManager.singleton.serverConnectionId, false, false);
48-
}
49-
}
50-
/// <summary>
5138
/// Initializes a new instance of the netId struct from transport values
5239
/// </summary>
5340
/// <param name="hostId">Host identifier.</param>

MLAPI/Data/TransportHost.cs renamed to MLAPI/Data/Transports/UNET/TransportHost.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System;
22

3-
namespace MLAPI.Data
3+
namespace MLAPI.Data.Transports.UNET
44
{
55
/// <summary>
66
/// Represents a Transport host
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
using MLAPI.MonoBehaviours.Core;
2+
using System;
3+
using System.Collections.Generic;
4+
using UnityEngine.Networking;
5+
6+
namespace MLAPI.Data.Transports.UNET
7+
{
8+
[Serializable]
9+
public class UnetTransport : IUDPTransport
10+
{
11+
public ChannelType InternalChannel { get => ChannelType.ReliableFragmentedSequenced; }
12+
13+
public uint HostDummyId { get => new NetId(0,0,true,false).GetClientId(); }
14+
15+
public uint InvalidDummyId { get => new NetId(0, 0, false, true).GetClientId(); }
16+
17+
public uint ServerNetId { get => new NetId((byte)serverHostId, (ushort)serverConnectionId, false, false).GetClientId(); }
18+
19+
public int serverConnectionId;
20+
public int serverHostId;
21+
22+
public List<TransportHost> ServerTransports = new List<TransportHost>()
23+
{
24+
new TransportHost()
25+
{
26+
Name = "UDP Socket",
27+
Port = 7777,
28+
Websockets = false
29+
}
30+
};
31+
32+
public int Connect(string address, int port, object settings, bool websocket, out byte error)
33+
{
34+
NetworkTransport.Init();
35+
int hostId = NetworkTransport.AddHost((HostTopology)settings);
36+
return NetworkTransport.Connect(hostId, address, port, 0, out error);
37+
}
38+
39+
public void DisconnectClient(uint clientId)
40+
{
41+
NetId netId = new NetId(clientId);
42+
if (netId.IsHost() || netId.IsInvalid())
43+
return;
44+
byte error;
45+
NetworkTransport.Disconnect(netId.HostId, netId.ConnectionId, out error);
46+
}
47+
48+
public void DisconnectFromServer()
49+
{
50+
byte error;
51+
NetworkTransport.Disconnect(serverHostId, serverConnectionId, out error);
52+
}
53+
54+
public int GetCurrentRTT(uint clientId, out byte error)
55+
{
56+
NetId netId = new NetId(clientId);
57+
return NetworkTransport.GetCurrentRTT(netId.HostId, netId.ConnectionId, out error);
58+
}
59+
60+
public int GetNetworkTimestamp()
61+
{
62+
return NetworkTransport.GetNetworkTimestamp();
63+
}
64+
65+
public int GetRemoteDelayTimeMS(uint clientId, int remoteTimestamp, out byte error)
66+
{
67+
NetId netId = new NetId(clientId);
68+
return NetworkTransport.GetRemoteDelayTimeMS(netId.HostId, netId.ConnectionId, remoteTimestamp, out error);
69+
}
70+
71+
public NetEventType PollReceive(out uint clientId, out int channelId, ref byte[] data, int bufferSize, out int receivedSize, out byte error)
72+
{
73+
int hostId;
74+
int connectionId;
75+
byte err;
76+
NetworkEventType eventType = NetworkTransport.Receive(out hostId, out connectionId, out channelId, data, bufferSize, out receivedSize, out err);
77+
clientId = new NetId((byte)hostId, (ushort)connectionId, false, false).GetClientId();
78+
NetworkError errorType = (NetworkError)err;
79+
if (errorType == NetworkError.Timeout)
80+
eventType = NetworkEventType.DisconnectEvent; //In UNET. Timeouts are not disconnects. We have to translate that here.
81+
error = 0;
82+
83+
//Translate NetworkEventType to NetEventType
84+
switch (eventType)
85+
{
86+
case NetworkEventType.DataEvent:
87+
return NetEventType.Data;
88+
case NetworkEventType.ConnectEvent:
89+
return NetEventType.Connect;
90+
case NetworkEventType.DisconnectEvent:
91+
return NetEventType.Disconnect;
92+
case NetworkEventType.Nothing:
93+
return NetEventType.Nothing;
94+
case NetworkEventType.BroadcastEvent:
95+
return NetEventType.Nothing;
96+
}
97+
return NetEventType.Nothing;
98+
}
99+
100+
public void QueueMessageForSending(uint clientId, ref byte[] dataBuffer, int dataSize, int channelId, bool skipqueue, out byte error)
101+
{
102+
NetId netId = new NetId(clientId);
103+
if (netId.IsHost() || netId.IsInvalid())
104+
{
105+
error = 0;
106+
return;
107+
}
108+
if (skipqueue)
109+
NetworkTransport.Send(netId.HostId, netId.ConnectionId, channelId, dataBuffer, dataSize, out error);
110+
else
111+
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, channelId, dataBuffer, dataSize, out error);
112+
}
113+
114+
public void Shutdown()
115+
{
116+
NetworkTransport.Shutdown();
117+
}
118+
119+
public void SendQueue(uint clientId, out byte error)
120+
{
121+
NetId netId = new NetId(clientId);
122+
NetworkTransport.SendQueuedMessages(netId.HostId, netId.ConnectionId, out error);
123+
}
124+
125+
public void RegisterServerListenSocket(object settings)
126+
{
127+
HostTopology topology = new HostTopology((ConnectionConfig)settings, NetworkingManager.singleton.NetworkConfig.MaxConnections);
128+
for (int i = 0; i < ServerTransports.Count; i++)
129+
{
130+
if (ServerTransports[i].Websockets)
131+
NetworkTransport.AddWebsocketHost(topology, ServerTransports[i].Port);
132+
else
133+
NetworkTransport.AddHost(topology, ServerTransports[i].Port);
134+
}
135+
}
136+
137+
public int AddChannel(ChannelType type, object settings)
138+
{
139+
ConnectionConfig config = (ConnectionConfig)settings;
140+
switch (type)
141+
{
142+
case ChannelType.Unreliable:
143+
return config.AddChannel(QosType.Unreliable);
144+
case ChannelType.UnreliableFragmented:
145+
return config.AddChannel(QosType.UnreliableFragmented);
146+
case ChannelType.UnreliableSequenced:
147+
return config.AddChannel(QosType.UnreliableSequenced);
148+
case ChannelType.Reliable:
149+
return config.AddChannel(QosType.Reliable);
150+
case ChannelType.ReliableFragmented:
151+
return config.AddChannel(QosType.ReliableFragmented);
152+
case ChannelType.ReliableSequenced:
153+
return config.AddChannel(QosType.ReliableSequenced);
154+
case ChannelType.StateUpdate:
155+
return config.AddChannel(QosType.StateUpdate);
156+
case ChannelType.ReliableStateUpdate:
157+
return config.AddChannel(QosType.ReliableStateUpdate);
158+
case ChannelType.AllCostDelivery:
159+
return config.AddChannel(QosType.AllCostDelivery);
160+
case ChannelType.UnreliableFragmentedSequenced:
161+
return config.AddChannel(QosType.UnreliableFragmentedSequenced);
162+
case ChannelType.ReliableFragmentedSequenced:
163+
return config.AddChannel(QosType.ReliableFragmentedSequenced);
164+
}
165+
return 0;
166+
}
167+
168+
public object GetSettings()
169+
{
170+
NetworkTransport.Init();
171+
return new ConnectionConfig()
172+
{
173+
SendDelay = 0
174+
};
175+
}
176+
177+
public void Connect(string address, int port, object settings, out byte error)
178+
{
179+
serverHostId = NetworkTransport.AddHost(new HostTopology((ConnectionConfig)settings, 1));
180+
serverConnectionId = NetworkTransport.Connect(serverHostId, address, port, 0, out error);
181+
}
182+
}
183+
}

MLAPI/Data/Transports/UnetTransport.cs

Lines changed: 0 additions & 93 deletions
This file was deleted.

0 commit comments

Comments
 (0)