GetHostEntry()不再解析地址

我最近从.NET v3.5切换到v4.0客户端配置文件,并在第一次运行GetHostEntry()时出现问题。

tcpClient.SocketInfo.SourceName = remoteMatcher.Host; // "88.255.126.48" tcpClient.SocketInfo.SourcePort = remoteMatcher.Port; // 999 IPHostEntry ipEntry = Dns.GetHostEntry(tcpClient.SocketInfo.SourceName); 

GetHostEntry()导致exception:

WSANO_DATA 11004有效名称,没有请求类型的数据记录。 请求的名称有效且在数据库中找到,但它没有正确的关联数据。 通常的示例是使用DNS(域名服务器)的主机名到地址转换尝试(使用gethostbyname或WSAAsyncGetHostByName)。 返回MX记录但没有A记录 – 表示主机本身存在,但不能直接访问。

我会重新启动机器,想在所有事情都丢失之前问这个问题。

更新:

我的解决方法:

  // .NET Framework v4.0 bug?? IPAddress ip; if (IPAddress.TryParse(tcpClient.SocketInfo.SourceName, out ip)) tcpClient.SocketInfo.SourceIP = tcpClient.SocketInfo.SourceName; else { IPHostEntry ipEntry = Dns.GetHostEntry(tcpClient.SocketInfo.SourceName); IPAddress[] addr = ipEntry.AddressList; tcpClient.SocketInfo.SourceIP = addr[addr.Length - 1].ToString(); } 

这是我尝试过的东西,我记得遇到同样的问题随时可以使用我的例子测试你的东西

**我使用IPHostEntry而不是**

 string[] host = (address.Split('@')); string hostname = host[1]; IPHostEntry IPhst = Dns.Resolve(hostname); IPEndPoint endPt = new IPEndPoint(IPhst.AddressList[0], 25); Socket s= new Socket(endPt.AddressFamily, SocketType.Stream,ProtocolType.Tcp); s.Connect(endPt); 

或者当我用它来获取电子邮件地址的主机名时

  try { Response.Write("One"); string[] host = (txtEmailAddress.Text.Split('@')); string hostname = host[1]; Response.Write(host); IPHostEntry IPhst = Dns.Resolve(hostname); IPEndPoint endPt = new IPEndPoint(IPhst.AddressList[0], 25); Socket s = new Socket(endPt.AddressFamily, SocketType.Stream, ProtocolType.Tcp); Response.Write(endPt); s.Connect(endPt); } catch (SocketException se) { lblErrMsg.Text = se.Message.ToString(); PublicUtils.AddError("Error: " + se.Message + txtEmailAddress.Text); txtEmailAddress.Focus(); return; } 

最近遇到同样的问题,GetHostEntry在给定IP地址时对主机名进行反向查找,在我的特定情况下,目标机器上的NetBIOS被关闭,这就是主机名解析失败的原因,而GetHostEntry抛出了上述exception。

GetHostAddresses更适合我的需求,它在给定IP地址时不进行反向查找,它只解析它并返回IPAddress本身。

来自MSDN: http : //msdn.microsoft.com/en-us/library/system.net.dns.gethostaddresses.aspx

传递IP字符串文字时,GetHostEntry方法表现出以下行为:

  1. 该方法尝试解析该地址。 如果hostNameOrAddress包含合法的IP字符串文字,则第一阶段成功。
  2. 尝试使用IP字符串文字的IP地址进行反向查找以获取主机名。 此结果设置为HostName属性。
  3. 此反向查找的主机名再次用于获取与该名称关联的所有可能的IP地址,并设置为AddressList属性。