【问题标题】:GetHostEntry() doesn't resolve the address anymoreGetHostEntry() 不再解析地址
【发布时间】:2011-07-28 09:08:12
【问题描述】:

我最近从 .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();
   }

【问题讨论】:

  • SocketException 还是 ArgumentException?
  • System.Net.Sockets.SocketException 被捕获 Source=System ErrorCode=11004 NativeErrorCode=11004 StackTrace:在 System.Net.Dns.InternalGetHostByAddress(IPAddress address, Boolean includeIPv6) at System.Net.Dns。 GetHostEntry(String hostNameOrAddress)
  • 老版本没问题。我刚刚将项目从 3.5 转换为 4.0 客户端配置文件,并在 app.config 的 中添加了 useLegacyV2RuntimeActivationPolicy="true" 属性

标签: c#


【解决方案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;
        }  

【讨论】:

    【解决方案2】:

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

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

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

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

    1. 该方法尝试解析地址。如果主机名或地址 包含合法的 IP 字符串文字,则第一阶段成功。
    2. 使用 IP 字符串文字的 IP 地址的反向查找是 试图获取主机名。这个结果被设置为 主机名属性。
    3. 使用了来自此反向查找的主机名 再次获取与 名称并设置为 AddressList 属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 2015-03-23
      • 2015-09-14
      相关资源
      最近更新 更多