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

时间:2012-05-03 07:38:10

标签: c# sockets

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

Dns.GetHostEntry(domain)抛出异常时,我知道该域名不存在。

  1. 我可以说,如果Dns.GetHostEntry(domain)成功,那么域确实存在,或者即使Dns.GetHostEntry(domain)成功,也不意味着(尚未)该域存在?
  2. s.Connect无法连接时,我可以说同样的话吗?我的意思是如果连接抛出一个异常,我可以说这个域不存在吗?
  3. 如果(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();
            }
        }
    }
    

2 个答案:

答案 0 :(得分:2)

当尝试连接套接字时,你会说几件事:

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

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

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

答案 1 :(得分:0)

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