From cfeb5b2404758bb03b1338f8ca7a4f72bca64ad7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=99=88=E5=9B=BD=E4=BC=9F?= <366193849@qq.com>
Date: Thu, 15 Jul 2021 17:33:01 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96GetLocalAddress?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FastGithub.Dns/DnsHostedService.cs | 6 ++--
FastGithub.Dns/RemoteRequest.cs | 54 +++++++-----------------------
2 files changed, 15 insertions(+), 45 deletions(-)
diff --git a/FastGithub.Dns/DnsHostedService.cs b/FastGithub.Dns/DnsHostedService.cs
index 3d2f3b8..05a8429 100644
--- a/FastGithub.Dns/DnsHostedService.cs
+++ b/FastGithub.Dns/DnsHostedService.cs
@@ -77,7 +77,7 @@ namespace FastGithub.Dns
var result = await this.socket.ReceiveFromAsync(this.buffer, SocketFlags.None, remoteEndPoint);
var datas = new byte[result.ReceivedBytes];
this.buffer.AsSpan(0, datas.Length).CopyTo(datas);
- this.HandleRequestAsync(datas, (IPEndPoint)result.RemoteEndPoint, stoppingToken);
+ this.HandleRequestAsync(datas, result.RemoteEndPoint, stoppingToken);
}
}
@@ -87,12 +87,12 @@ namespace FastGithub.Dns
///
///
///
- private async void HandleRequestAsync(byte[] datas, IPEndPoint remoteEndPoint, CancellationToken cancellationToken)
+ private async void HandleRequestAsync(byte[] datas, EndPoint remoteEndPoint, CancellationToken cancellationToken)
{
try
{
var request = Request.FromArray(datas);
- var remoteRequest = new RemoteRequest(request, remoteEndPoint.Address);
+ var remoteRequest = new RemoteRequest(request, remoteEndPoint);
var response = await this.requestResolver.Resolve(remoteRequest, cancellationToken);
await this.socket.SendToAsync(response.ToArray(), SocketFlags.None, remoteEndPoint);
}
diff --git a/FastGithub.Dns/RemoteRequest.cs b/FastGithub.Dns/RemoteRequest.cs
index eb1cb7b..7a8e745 100644
--- a/FastGithub.Dns/RemoteRequest.cs
+++ b/FastGithub.Dns/RemoteRequest.cs
@@ -1,7 +1,7 @@
using DNS.Protocol;
-using System.Buffers.Binary;
+using System;
using System.Net;
-using System.Net.NetworkInformation;
+using System.Net.Sockets;
namespace FastGithub.Dns
{
@@ -13,17 +13,17 @@ namespace FastGithub.Dns
///
/// 获取远程地址
///
- public IPAddress RemoteAddress { get; }
+ public EndPoint RemoteEndPoint { get; }
///
/// 远程请求
///
///
- ///
- public RemoteRequest(Request request, IPAddress remoteAddress)
+ ///
+ public RemoteRequest(Request request, EndPoint remoteEndPoint)
: base(request)
{
- this.RemoteAddress = remoteAddress;
+ this.RemoteEndPoint = remoteEndPoint;
}
///
@@ -32,45 +32,15 @@ namespace FastGithub.Dns
///
public IPAddress? GetLocalAddress()
{
- foreach (var @interface in NetworkInterface.GetAllNetworkInterfaces())
+ try
{
- var addresses = @interface.GetIPProperties().UnicastAddresses;
- foreach (var item in addresses)
- {
- if (IsInSubNet(item.IPv4Mask, item.Address, this.RemoteAddress))
- {
- return item.Address;
- }
- }
+ using var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
+ socket.Connect(this.RemoteEndPoint);
+ return socket.LocalEndPoint is IPEndPoint localEndPoint ? localEndPoint.Address : default;
}
- return default;
- }
-
- ///
- /// 是否在相同的子网里
- ///
- ///
- ///
- ///
- ///
- private static bool IsInSubNet(IPAddress mask, IPAddress local, IPAddress remote)
- {
- if (local.AddressFamily != remote.AddressFamily)
+ catch (Exception)
{
- return false;
- }
-
- var maskValue = GetValue(mask);
- var localValue = GetValue(local);
- var remoteValue = GetValue(remote);
- return (maskValue & localValue) == (maskValue & remoteValue);
-
- static long GetValue(IPAddress address)
- {
- var bytes = address.GetAddressBytes();
- return bytes.Length == sizeof(int)
- ? BinaryPrimitives.ReadInt32BigEndian(bytes)
- : BinaryPrimitives.ReadInt64BigEndian(bytes);
+ return default;
}
}
}