我可以说如果Socket.Connect失败,域就不存在吗?

本文关键字:不存在 失败 可以说 如果 Socket Connect 我可以 | 更新日期: 2023-09-27 18:33:13

我想检查是否存在某些电子邮件域。

Dns.GetHostEntry(domain)抛出异常时,我确信该域不存在。

  1. 我能说,如果Dns.GetHostEntry(domain)成功了,那么这个域确实存在,或者即使Dns.GetHostEntry(domain)成功了,也不意味着(还)那个域存在?
  2. 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();
        }
    }
}

我可以说如果Socket.Connect失败,域就不存在吗?

当尝试连接套接字时,您说了几件事:

  • 有从我的计算机到目标计算机的网络路径
  • 网络路径没有防火墙和其他限制
  • 目标
  • 计算机正在目标端口上托管服务
  • 目标
  • 计算机正在接受我在该目标服务上的连接

所有这些都发生在主机名解析为 IP 之后

所以你的问题的答案是否定的。如果Socket.Connect失败,则可能是域不存在,或者上述任何原因(也许更多)。

经过一些研究,我发现根据 dns 检查 mx 记录会告诉我域是否可以接收电子邮件。如果 DNS 服务器确实返回域的 mx 记录,则仅表示该域可以接收电子邮件。如果没有返回 mx 记录,则域无法接收电子邮件 == 此类域不存在