我可以说如果Socket.Connect失败,域就不存在吗?
本文关键字:不存在 失败 可以说 如果 Socket Connect 我可以 | 更新日期: 2023-09-27 18:33:13
我想检查是否存在某些电子邮件域。
当Dns.GetHostEntry(domain)
抛出异常时,我确信该域不存在。
- 我能说,如果
Dns.GetHostEntry(domain)
成功了,那么这个域确实存在,或者即使Dns.GetHostEntry(domain)
成功了,也不意味着(还)那个域存在? - 当
s.Connect
连接失败时,我可以说同样的话吗?我的意思是,如果连接抛出异常,我可以说这样的域不存在吗?
如果(1)为真,那么为了检查域是否存在(1)就足够了,对吧?
public static bool Lookup(string domain)
{
if (domain == null) throw new ArgumentNullException("domain");
try {
IPHostEntry ipHost = Dns.GetHostEntry(domain);
var endPoint = new IPEndPoint(ipHost.AddressList[0], _dnsPort);
return Transfer(endPoint);
}
catch (SocketException ex)
{
++attempts;
}
return false;
}
public static bool Transfer(IPEndPoint endPoint)
{
int attempts = 0;
while(attempts <= _attempts)
{
try
{
var s = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
s.Connect(endPoint);
}
catch (SocketException ex)
{
++attempts;
}
finally
{
s.Close();
}
}
}
当尝试连接套接字时,您说了几件事:
- 有从我的计算机到目标计算机的网络路径
- 网络路径没有防火墙和其他限制 目标
- 计算机正在目标端口上托管服务 目标
- 计算机正在接受我在该目标服务上的连接
所有这些都发生在主机名解析为 IP 之后。
所以你的问题的答案是否定的。如果Socket.Connect
失败,则可能是域不存在,或者上述任何原因(也许更多)。
经过一些研究,我发现根据 dns 检查 mx 记录会告诉我域是否可以接收电子邮件。如果 DNS 服务器确实返回域的 mx 记录,则仅表示该域可以接收电子邮件。如果没有返回 mx 记录,则域无法接收电子邮件 == 此类域不存在