Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions DllNetwork.slnx
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
<Solution>
<Project Path="DllNetwork/DllNetwork.csproj" />
<Project Path="DllSocket.Test/DllSocket.Test.csproj" Id="e3f318a5-fdf9-4087-be7e-55e9c56bcd4c" />
<Project Path="DllSocket/DllSocket.csproj" Id="0d950387-53f6-4ad3-877a-d232eb9cdb31" />
<Project Path="NetworkTest/NetworkTest.csproj" Id="5481435e-8aaf-4636-a930-404e91d4fd22" />
</Solution>
20 changes: 18 additions & 2 deletions DllNetwork/AddressHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,22 @@ namespace DllNetwork;

public static class AddressHelper
{
public static List<IPAddress> Addresses
{
get
{
if (field == null)
{
field = GetInterfaceAddresses();

if (!NetworkSettings.Instance.Manager.EnableIpv6)
field.RemoveAll(static x => x.AddressFamily == AddressFamily.InterNetworkV6);
}

return field;
}
}

private static bool WhereCheck(NetworkInterface networkInterface)
{
if (networkInterface.NetworkInterfaceType is NetworkInterfaceType.Loopback or NetworkInterfaceType.Tunnel)
Expand All @@ -29,9 +45,9 @@ public static List<IPAddress> GetInterfaceAddresses()
List<IPAddress> addresses = [];

var interfaces = NetworkInterface.GetAllNetworkInterfaces().Where(WhereCheck);
foreach (var ipv4 in interfaces)
foreach (var @interface in interfaces)
{
GetIpAddress(ipv4.GetIPProperties(), ref addresses);
GetIpAddress(@interface.GetIPProperties(), ref addresses);
}

if (addresses.Count == 0)
Expand Down
87 changes: 87 additions & 0 deletions DllNetwork/Broadcast/BroadcastCustom.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
using DllNetwork.Json;
using DllNetwork.Managers;
using Serilog;
using System.Text.Json;

namespace DllNetwork.Broadcast;

public static class BroadcastCustom
{
static readonly HttpClient? client;
static BroadcastCustom()
{
string endPoint = NetworkSettings.Instance.Broadcast.CustomBroadcastServerEndpoint;
if (string.IsNullOrEmpty(endPoint))
return;

client = new()
{
BaseAddress = new Uri(endPoint)
};
}

public static void Start()
{
if (client == null)
return;

BroadcastJson startJson = new()
{
AccountId = NetworkSettings.Instance.Account.AccountId,
Addresses = [.. AddressHelper.Addresses.Select(static x => x.ToString())],
Port = ServerManager.Instance.Port,
};

string data = JsonSerializer.Serialize(startJson, SourceGenerationContext.Default.BroadcastJson);
using var content = new StringContent(data);

var response = client.PostAsync("/start", content).Result;
if (response.StatusCode == System.Net.HttpStatusCode.OK)
return;

try
{
string rsp = response.Content.ReadAsStringAsync().Result;
Log.Warning("[BroadcastCustom.Start] Error: {code} {response}", response.StatusCode, rsp);
}
catch (Exception ex)
{
Log.Warning("[BroadcastCustom.Start] Error {ex}", ex);
}
Comment thread
github-code-quality[bot] marked this conversation as resolved.
Fixed
Comment thread
Detanup01 marked this conversation as resolved.
Dismissed

}

public static void Stop()
{
if (client == null)
return;

// We not really care about if account doesnt exists.
client.DeleteAsync($"/stop?accountId={NetworkSettings.Instance.Account.AccountId}");
}

public static List<BroadcastJson> GetList()
{
List<BroadcastJson> broadcasts = [];

if (client == null)
return broadcasts;

var httpResponse = client.GetAsync("/list").Result;

if (httpResponse.StatusCode != System.Net.HttpStatusCode.OK)
return broadcasts;

try
{
string rsp = httpResponse.Content.ReadAsStringAsync().Result;
broadcasts = JsonSerializer.Deserialize(rsp, SourceGenerationContext.Default.ListBroadcastJson) ?? [];
}
catch (Exception ex)
{
Log.Warning("[BroadcastCustom.GetList] Error {ex}", ex);
}
Comment thread
github-code-quality[bot] marked this conversation as resolved.
Fixed
Comment thread
Detanup01 marked this conversation as resolved.
Dismissed

return broadcasts;
}
}
124 changes: 124 additions & 0 deletions DllNetwork/Broadcast/BroadcastUdp.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
using LiteNetLib.Utils;
using DllNetwork.Json;
using DllNetwork.Managers;
using System.Net;
using System.Net.Sockets;

namespace DllNetwork.Broadcast;

public static class BroadcastUdp
{
static readonly UdpClient udp;
static readonly UdpClient? udpv6;
static readonly NetDataWriter netDataWriter = new();
public static readonly List<BroadcastJson> AcceptedBroadcasts = [];

static BroadcastUdp()
{
// UDP v4
udp = new()
{
EnableBroadcast = true,
};


int broadcastPort = AddressHelper.GetPort(NetworkSettings.Instance.Broadcast.BroadcastPort, NetworkSettings.Instance.Broadcast.EndRangeBroadcastPort, false);
IPEndPoint broadCastEndPoint = new(IPAddress.Any, broadcastPort);

udp.Client.Bind(broadCastEndPoint);

// UDP v6
if (!NetworkSettings.Instance.Manager.EnableIpv6)
return;

udpv6 = new()
{
EnableBroadcast = true,
};

broadcastPort = AddressHelper.GetPort(NetworkSettings.Instance.Broadcast.BroadcastPort, NetworkSettings.Instance.Broadcast.EndRangeBroadcastPort, false);
broadCastEndPoint = new(IPAddress.IPv6Any, broadcastPort);

udpv6.Client.Bind(broadCastEndPoint);
}

public static void Start()
{
BroadcastPacket packet = new()
{
Id = NetworkSettings.Instance.Account.AccountId,
Addresses = [.. AddressHelper.Addresses.Select(static x => x.ToString())],
ConnectPort = ServerManager.Instance.Port,
};

PacketProcessor.Processor.WriteNetSerializable(netDataWriter, ref packet);

var span = netDataWriter.AsReadOnlySpan();

for (int port = NetworkSettings.Instance.Broadcast.BroadcastPort; port < NetworkSettings.Instance.Broadcast.EndRangeBroadcastPort; port++)
{
IPEndPoint address = new(IPAddress.Broadcast, port);
udp.Send(span, address);
udpv6?.Send(span, address);
}
}

public static void Stop()
{

}

public static List<BroadcastJson> GetList()
{
foreach (var item in AcceptedBroadcasts)
{
PingHelper.ClearPingedAccount(item.AccountId);
}

List<BroadcastJson> normalized = [];

foreach (var item in AcceptedBroadcasts)
{
if (!normalized.Exists(x => item.AccountId == x.AccountId))
{
normalized.Add(item);
continue;
}

var found = normalized.FirstOrDefault(x => item.AccountId == x.AccountId);
if (found == null)
{
continue;
}

found.Addresses.AddRange(item.Addresses);
}

AcceptedBroadcasts.Clear();
AcceptedBroadcasts.AddRange(normalized);

return AcceptedBroadcasts;
}


public static void UdpUpdate()
{
udp.ReceiveAsync().ContinueWith(task =>
{
if (!task.IsCompletedSuccessfully)
return;

NetDataReader reader = new(task.Result.Buffer);
PacketProcessor.Processor.ReadPacket(reader, task.Result.RemoteEndPoint);
});

udpv6?.ReceiveAsync().ContinueWith(task =>
{
if (!task.IsCompletedSuccessfully)
return;

NetDataReader reader = new(task.Result.Buffer);
PacketProcessor.Processor.ReadPacket(reader, task.Result.RemoteEndPoint);
});
}
}
79 changes: 79 additions & 0 deletions DllNetwork/BroadcastCommunication.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# Communication (broadcast) with APPNAME via Web
This communication exist for accounts that cannot use normal broadcast on the PC

## ErrorCodes
There are many errors whenever using this app can happen to break the software.\
1 -> Account already exists
2 -> Account does not exists

## Start
Your server must store this account until its calls "stop".\
The app automaticly tries to call the `/start` endpoint once `BroadcastCustom.Start()` called.\
The request:
```
POST /start

{
"accountId": "1",
"addresses":
[
"192.168.1.50",
"192.168.3.50",
"26.525.151.51",
"::1"
],
"port": 35666
}
```
Whenever the account already exist respond with:
```
400

1
```

## Stop
Your server must remove this account from the storage.\
The app will call `/stop?accountId=<ID>` when `BroadcastCustom.Stop()` called.
The request:
```
DELETE /stop?accountId=<ID>
```

Whenever the account does not exist respond with:
```
400

2
```

## List
Your server must respond with a list of accounts to able to show all available users they can connect to.
```
GET /list

[
{
"accountId": "1",
"addresses":
[
"192.168.1.50",
"192.168.3.50",
"26.525.151.51",
"::1"
],
"port": 35666
},
{
"accountId": "2",
"addresses":
[
"192.168.1.70",
"192.168.3.95",
"26.525.151.151",
"::1"
],
"port": 84643
}
]
```
6 changes: 6 additions & 0 deletions DllNetwork/Delegates.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
using LiteNetLib;

namespace DllNetwork;

public delegate void ConnectedDelegate(NetPeer peer);
public delegate void DisconnectedDelegate(NetPeer peer, DisconnectInfo disconnectInfo);
15 changes: 2 additions & 13 deletions DllNetwork/DllNetwork.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,8 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="EIV_Pack" Version="2.1.0" />
<PackageReference Include="EIV_Pack.Generator" Version="2.1.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="LiteNetLib" Version="2.1.4" />
<PackageReference Include="Serilog" Version="4.3.1" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\DllSocket\DllSocket.csproj" />
</ItemGroup>

<ItemGroup>
<Using Include="DllNetwork.Packets" />
</ItemGroup>

</Project>
32 changes: 0 additions & 32 deletions DllNetwork/Formatters/Formatters.cs

This file was deleted.

Loading
Loading