67 lines
No EOL
2.2 KiB
C#
67 lines
No EOL
2.2 KiB
C#
using Mirror;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Net;
|
|
using UnityEngine;
|
|
|
|
namespace LightReflectiveMirror
|
|
{
|
|
public partial class LightReflectiveMirrorTransport : Transport
|
|
{
|
|
IEnumerator NATPunch(IPEndPoint remoteAddress)
|
|
{
|
|
for (int i = 0; i < 10; i++)
|
|
{
|
|
_NATPuncher.Send(_punchData, 1, remoteAddress);
|
|
yield return new WaitForSeconds(0.25f);
|
|
}
|
|
}
|
|
|
|
void RecvData(IAsyncResult result)
|
|
{
|
|
IPEndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);
|
|
var data = _NATPuncher.EndReceive(result, ref newClientEP);
|
|
_NATPuncher.BeginReceive(new AsyncCallback(RecvData), _NATPuncher);
|
|
|
|
if (!newClientEP.Address.Equals(_relayPuncherIP.Address))
|
|
{
|
|
if (_isServer)
|
|
{
|
|
if (_serverProxies.TryGetByFirst(newClientEP, out SocketProxy foundProxy))
|
|
{
|
|
if (data.Length > 2)
|
|
foundProxy.RelayData(data, data.Length);
|
|
}
|
|
else
|
|
{
|
|
_serverProxies.Add(newClientEP, new SocketProxy(_NATIP.Port + 1, newClientEP));
|
|
_serverProxies.GetByFirst(newClientEP).dataReceived += ServerProcessProxyData;
|
|
}
|
|
}
|
|
|
|
if (_isClient)
|
|
{
|
|
if (_clientProxy == null)
|
|
{
|
|
_clientProxy = new SocketProxy(_NATIP.Port - 1);
|
|
_clientProxy.dataReceived += ClientProcessProxyData;
|
|
}
|
|
else
|
|
{
|
|
_clientProxy.ClientRelayData(data, data.Length);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ServerProcessProxyData(IPEndPoint remoteEndpoint, byte[] data)
|
|
{
|
|
_NATPuncher.Send(data, data.Length, remoteEndpoint);
|
|
}
|
|
|
|
void ClientProcessProxyData(IPEndPoint _, byte[] data)
|
|
{
|
|
_NATPuncher.Send(data, data.Length, _directConnectEndpoint);
|
|
}
|
|
}
|
|
} |