-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathAreaServerIPAddressPortRequest.cs
More file actions
53 lines (44 loc) · 2.25 KB
/
AreaServerIPAddressPortRequest.cs
File metadata and controls
53 lines (44 loc) · 2.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System;
using System.Buffers.Binary;
using System.Collections.Generic;
using System.Net;
using System.Threading.Tasks;
using Fragment.NetSlum.Core.Extensions;
using Fragment.NetSlum.Networking.Attributes;
using Fragment.NetSlum.Networking.Constants;
using Fragment.NetSlum.Networking.Objects;
using Fragment.NetSlum.Networking.Packets.Response;
using Fragment.NetSlum.Networking.Sessions;
using Microsoft.Extensions.Logging;
using Fragment.NetSlum.Networking.Packets.Response.AreaServer;
using Fragment.NetSlum.TcpServer.Extensions;
namespace Fragment.NetSlum.Networking.Packets.Request.AreaServer;
[FragmentPacket(MessageType.Data, OpCodes.Data_AreaServerIpPortRequest)]
public class AreaServerIPAddressPortRequest : BaseRequest
{
private readonly ILogger<AreaServerIPAddressPortRequest> _logger;
public AreaServerIPAddressPortRequest(ILogger<AreaServerIPAddressPortRequest> logger)
{
_logger = logger;
}
public override ValueTask<ICollection<FragmentMessage>> GetResponse(FragmentTcpSession session, FragmentMessage request)
{
var ipAddressBytes = new Span<byte>(new byte[4]);
request.Data.Span[..4].CopyTo(ipAddressBytes);
ipAddressBytes.Reverse();
var asIpAddress = new IPAddress(ipAddressBytes.ToArray());
var asPort = BinaryPrimitives.ReadUInt16BigEndian(request.Data[4..6].Span);
if (asIpAddress.IsPrivate())
{
var socketIp = IPAddress.Parse(session.Socket!.GetClientIp());
_logger.LogWarning("Area server {ServerName} sent a private IP of {PrivateIp}. Attempting to override using their socket IP of {SocketIp}", session.AreaServerInfo!.ServerName, asIpAddress, socketIp);
session.AreaServerInfo!.PrivateConnectionEndpoint = new IPEndPoint(asIpAddress, asPort);
asIpAddress = socketIp;
}
session.AreaServerInfo!.PublicConnectionEndpoint = new IPEndPoint(
asIpAddress, BinaryPrimitives.ReadUInt16BigEndian(request.Data[4..6].Span));
_logger.LogInformation("Area Server Published Connection Info: {NewLine}{AreaServerInfo}", Environment.NewLine, session.AreaServerInfo!.ToString());
BaseResponse response = new AreaServerIPAddressPortResponse();
return SingleMessage(response.Build());
}
}