2011-10-17 47 views

回答

4

如果你想要做的是找出給定主機是否會接受端口80上的TCP連接,你可以這樣做:

$host = '193.33.186.70'; 
$port = 80; 
$waitTimeoutInSeconds = 1; 
if ($fp = fsockopen($host,$port,$errCode,$errStr,$waitTimeoutInSeconds)) { 
    // It worked 
} else { 
    // It didn't work 
} 
fclose($fp); 

對於TCP以外的任何東西都會更困難(儘管你指定了80,我想你正在尋找一個活動的HTTP服務器,所以TCP就是你想要的)。 TCP被排序並確認,所以當成功建立連接時,您將隱式接收返回的數據包。大多數其他傳輸協議(通常是UDP,但其他傳輸協議)不以這種方式工作,除非重疊的應用層協議實現它,否則數據報將不會被確認。

您以這種方式詢問這個問題的事實告訴我,您在Transport Layer協議方面的知識存在根本差距。您應該閱讀ICMPTCP以及OSI Model

1

通常情況下,您無法ping通端口:ping對ICMP沒有端口抽象。

如果您想要的只是檢查給定端口是否處於活動狀態,請使用套接字或(對於端口80)curl

2

Ping命令沒有使用TCP協議,而是ICMP協議。因此您不能使用TCP端口80.

您可以使用fsockopen()cURL來ping服務器,並使用gethostbyaddr()來獲取域名。

0

ping發送ICMP數據包。要測試TCP端口,您需要發送TCP數據包。

但是,即使打開並立即關閉TCP連接通常也不是您想要的。相反,只需測試服務您希望在那裏。例如,要測試一個HTTP服務器是否正在運行:

<?php 
$ch = curl_init("http://www.example.com/"); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
$ping_result = curl_exec($ch); 
curl_close($ch); 
echo 'Service ' . ($ping_result ? 'up' : 'down');