Ошибка соединения TCP-сокета whois для одного сервера

Я пишу короткий сценарий для запроса доменных имен с соответствующих серверов whois — в то время как в большинстве случаев, хотя TCP-соединение через порт 43, похоже, работает для большинства серверов whois, запросы к whois.markmonitor.com, похоже, завершаются с ошибкой. с надписью Неверный запрос.

Вот основные элементы того, что я использую:

#!/usr/bin/perl

#whois.pl

use strict;
use IO::Socket;

my $domain_name = "google.com";
my $query_socket = new IO::Socket::INET(
        PeerAddr => 'whois.iana.org',
        PeerPort => 43,
        Proto => 'tcp');
print $query_socket "$domain_name ";
print $query_socket "\n\r";
while(my $this_line = <$query_socket>) {
        print $this_line;
}
close($query_socket);

Как видно выше, используется сервер whois whois.iana.org; это также работает, как и ожидалось, с whois.internic.net. Только в случае whois.markmonitor.com видна следующая ошибка:

$ perl whois.pl 
Invalid query

Может ли кто-нибудь помочь пролить больше света на то, как я могу получить более подробный вывод, чтобы проверить, есть ли какие-либо ошибки в запросе, который отправляется на сервер?

В качестве дополнительного теста обычное соединение через telnet работает, как и ожидалось, как показано ниже:

$ telnet whois.markmonitor.com 43
Trying 64.124.14.21...
Connected to whois.markmonitor.com.
Escape character is '^]'.
google.com
Domain Name: google.com
Registry Domain ID: 2138514_DOMAIN_COM-VRSN
Registrar WHOIS Server: whois.markmonitor.com
Registrar URL: http://www.markmonitor.com
Updated Date: 2015-06-12T10:38:52-0700
Creation Date: 1997-09-15T00:00:00-0700
......<output truncated>......

что наводит меня на мысль, что фактические подключения к серверу через порт 43 принимаются на стороне сервера.


person rahuL    schedule 29.11.2015    source источник
comment
Я думаю, это из-за лишнего пробела в "$domain_name "   -  person wnrph    schedule 29.11.2015
comment
Либо так, либо ему не нравится \r\n   -  person Sobrique    schedule 29.11.2015


Ответы (2)


Как отмечает artistoex, это потому, что в вашем доменном имени есть пробел. Измените строку печати на:

print {$query_socket} "$domain_name\n";

(Примечание: фигурные скобки сделаны из соображений стиля и могут быть опущены — я предпочитаю, чтобы они давали понять, что это дескриптор файла)

person Sobrique    schedule 29.11.2015

В соответствии с RFC3912 ожидается, что клиент будет общаться так, как в протоколе whois: "Все запросы завершаются с помощью ASCII CR, а затем ASCII LF"

Поэтому в вашем коде вместо "\n\r" используйте "\r\n". И удалите лишний пробел, как написано в других ответах.

Обратите внимание, однако, что whois не является четко определенным структурированным протоколом: не ожидайте, что все серверы whois будут работать одинаково или придерживаться каких-либо стандартов. Вы найдете много странных случаев...

person Patrick Mevzek    schedule 02.01.2018