当前位置: 首页 > 编程语言 > C#

SpecifyingDNSServersUsedtoResolveHostnamesin.NETSharing

时间:2023-04-11 02:36:13 C#

SpecifyingDNSServersUsedtoResolveHostnamesin.NET请问有没有办法强制System.Net.Dns类使用一套自定义DNS服务器来解析主机名,而不是使用与主网络连接关联的服务器。我怀疑这只能使用像DnDns(http://dndns.codeplex.com)这样的自定义库,但我希望这可以在.NET中完成。无法使用.NetFramework执行此操作。Dns.Resolve方法依赖于内部Win32API,后者又通过与网络连接关联的DNS服务器。为了使其工作,您必须更改与网络适配器地址关联的DNS服务器。您可以使用“JHSoftware的.NET.NET客户端”来执行此操作-无需更改DNS本地服务器。请参考http://www.simpledns.com/dns-client-lib.aspx上的第二个代码示例测试.net标准:publicstaticasyncTaskGetHostEntryAsync(stringhost,stringdns=null){if(string.IsNullOrEmpty(host)){返回空值;}//检查缓存结果是否存在Tuplekey=newTuple(host,dns);如果(NetHelper._dnsCache.TryGetValue(key,outTuplerecord)&&record.Item2>DateTime.Now){returnrecord.Item1;}//检查dns服务器的地址或端口IPHostEntryresult=null;国际域名系统端口;if(dns!=null){string[]blocks=dns.Split(':');if(blocks.Length==2&&int.TryParse(blocks[1],outdnsPort))//dns是ipv4{dns=blocks[0];}elseif(blocks.Length==9&&int.TryParse(blocks[8],outdnsPort))//dns是ipv6{blocks[0]=blocks[0].TrimStart('[');块[7]=块[7].TrimStart(']');dns=string.Format("{0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}",块);}else{dnsPort=53;}}else{dnsPort=53;}//检查host是否为ip地址if(host[0]=='['&&host[host.Length-1]==']')//IPV6地址{host=host.Substring(1,host.Length-2);}if(IPAddress.TryParse(host,outIPAddressaddress)){result=newIPHostEntry{AddressList=newIPAddress[]{address}};}elseif(string.IsNullOrEmpty(dns)){result=awaitDns.GetHostEntryAsync(host);}else{#region用自定义的dns服务器IPAddressdnsAddr解析;if(!IPAddress.TryParse(dns,outdnsAddr)){thrownewArgumentException("Thednshostmustbeipaddress.",nameof(dns));}使用(MemoryStreamms=newMemoryStream()){Randomrnd=newRandom();//关于dns消息:http://www.ietf.org/rfc/rfc1035.txt//写入消息头。ms.Write(newbyte[]{(byte)rnd.Next(0,0xFF),(byte)rnd.Next(0,0xFF),0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00},0,12);//写host查询。foreach(host.Split('.')中的字符串块){byte[]data=Encoding.UTF8.GetBytes(block);ms.WriteByte((byte)data.Length);ms.Write(数据,0,数据a.长度);}ms.WriteByte(0);//查询结束,muest0(nullstring)//查询类型:Ams.WriteByte(0x00);ms.WriteByte(0x01);//查询类:INms.WriteByte(0x00);ms.WriteByte(0x01);套接字socket=newSocket(SocketType.Dgram,ProtocolType.Udp);try{//发送到dns服务器byte[]buffer=ms.ToArray();while(socket.SendTo(buffer,0,buffer.Length,SocketFlags.None,newIPEndPoint(dnsAddr,dnsPort))191){return;}索引+=长度;}}列表地址=newList();while(index(result,DateTime.Now.AddMinutes(15));#pragmawarningdisableCS4014Task.Run(async()=>{awaitTask.Delay((int)TimeSpan.FromMinutes(15).TotalMilliseconds);NetHelper._dnsCache.Remove(key);});#pragmawarningrestoreCS4014returnresult;}如果你能够在docker容器中运行应用程序,你可以在启动时提供dns服务器ip地址dockerrun--dns=1.2.3.4repo/myimagecommand.exehttps://docs.docker.com/v17.09/engine/userguide/networking/configure-dns/以上是C#学习教程:指定在.NET中用于解析主机名的DNS服务器分享的所有内容,如果对你有用,需要详细了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: