2015-11-29 162 views
2

我正在寫一個簡短的腳本,分別從各自的WHOIS服務器查詢域名 - 而在大多數情況下,同時通過端口43的TCP連接似乎是工作對於大多數域名註冊服務器上,查詢whois.markmonitor.com似乎與一個奇怪的錯誤,上面寫着無效查詢將失敗。whois的TCP套接字連接失敗的一個服務器

下面是我用什麼樣的準系統:

#!/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.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到服務器的實際連接被接受的服務器端。

+1

我想這是由於額外的空間字符在'「$ domain_name」' – artistoex

+0

無論是它或它不喜歡'\ r \ n' – Sobrique

回答

1

由於artistoex筆記 - 那是因爲有一個在你的域名空間。 更改您的打印線:

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

(注 - 花括號風格的原因,並且可以省略 - 我喜歡他們清楚這是一個文件句柄)

0

RFC3912客戶端期望在whois協議中進行通信:「所有請求都以ASCII CR和ASCII LF終止」

因此在您的代碼中,請使用"\r\n"而不是"\n\r"。並刪除像寫在其他答覆中的額外空間。

但請注意whois不是一個明確定義的結構化協議:不要指望所有whois服務器以相同的方式工作,也不要遵守某種標準。你會發現很多奇怪的情況...