我最近从.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();
}
答案 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方法会出现以下行为:
- 该方法尝试解析地址。如果是hostNameOrAddress 包含合法的IP字符串文字,然后第一阶段成功。
- 使用IP字符串文字的IP地址进行反向查找 试图获取主机名。此结果设置为 HostName属性。
- 使用此反向查找中的主机名 再次获取与之关联的所有可能的IP地址 name并设置为AddressList属性。
醇>