Тайм-аут TcpClient на имя хоста IMAP, который не существует - PullRequest
0 голосов
/ 01 июня 2018

Итак, у меня есть очень простой скрипт:

#region Get Hostname IP
IPAddress[] dnsRecords = Dns.GetHostAddresses(hostname);
string ipHostname = dnsRecords[0].ToString();
if (ipHostname.Length == 0) {
    responseCode = imapLoginResponse.Failed;
    return false;
}
#endregion
#region Try make a request to the Host, Port
try {
    _Connection = new TcpClient(ipHostname, port);
} catch (SocketException ex) {
    System.Diagnostics.Debug.Write("-" + hostname + "-" + ipHostname + "- " + ex.Message);
    responseCode = ex.Message == "No such host is known" || ex.Message.StartsWith("No connection could be made because the target machine actively refused it") ? imapLoginResponse.BadHostname : imapLoginResponse.Failed;
    return false;
}

Приведенный выше код просто пытается подключиться к серверу IMAP.

  • Get imap. {Domain.ext} DNSIP-адрес записи
  • Попробуйте подключиться к этому IP-адресу с портом 993
  • Вуаля

Что происходит с веб-сайтами: битые / плохие / заброшенные / припаркованные:

  • Get imap. {Domain.ext} DNS-запись IP, каким-то образом получит один, даже если он не существует
  • Попробуйте подключиться к этому IP с портом 993
  • Серверне отвечает, что приводит к тайм-ауту

Что мне теперь делать?Я не могу отменить это до «BadHostname», так как это может быть просто проблема с подключением на стороне пользователя или даже без подключения к Интернету.

Если бы я просто повторил здесь, это закончилось бы бесконечным циклом.Хотя да, я мог бы сделать 5 попыток == неверная вещь, но это не совсем точно и все равно может быть временной проблемой с Интернетом.

Мой вопрос: почему он получает IP-адрес DNS-записи для записи, которая несуществовать?И что я должен делать, когда происходит что-то подобное?

Если вам нужно протестировать, попробуйте это с помощью: imap.celerityinc.com (без celebrityinc.com), и вы сможете убедиться сами.

1 Ответ

0 голосов
/ 01 июня 2018

Разрешение имени и услуги, предоставляемые по IP-адресу, являются независимыми.Вы получаете запись DNS, потому что она существует в некоторой точке иерархии DNS с определенным временем жизни.

Что вы можете сделать, когда происходит нечто подобное?Очистите локальный кэш DNS.Попробуйте разные DNS-серверы.Вернитесь к SOA с собственным решением DNS-запросов.

...