GetHostEntry()不再解析该地址

时间:2011-07-28 09:08:12

标签: c#

我最近从.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()会导致异常:

  

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

2 个答案:

答案 0 :(得分:1)

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

**我使用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;
        }  

答案 1 :(得分:0)

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

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

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

  

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

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