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; } } }