【发布时间】: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#