2012-03-23 13 views
34

मुझे एक PHP स्क्रिप्ट चाहिए जो आपको एक आईपी पता और पोर्ट नंबर (ip:port) पिंग करने की अनुमति देती है। मुझे एक समान लिपि मिली लेकिन यह केवल वेबसाइटों के लिए काम करता है, ip:port नहीं।मैं PHP के साथ सर्वर पोर्ट को कैसे पिंग कर सकता हूं?

<?php 

function ping($host, $port, $timeout) 
{ 
    $tB = microtime(true); 
    $fP = fSockOpen($host, $port, $errno, $errstr, $timeout); 
    if (!$fP) { return "down"; } 
    $tA = microtime(true); 
    return round((($tA - $tB) * 1000), 0)." ms"; 
} 

//Echoing it will display the ping if the host is up, if not it'll say "down". 
echo ping("www.google.com", 80, 10); 

?> 

मैं इसे एक गेम सर्वर के लिए चाहता हूं।

विचार यह है कि मैं आईपी पता और पोर्ट नंबर टाइप कर सकता हूं, और मुझे पिंग प्रतिक्रिया मिलती है।

+0

उपयोग [सॉकेट कनेक्ट] (http://www.php.net/manual/en/function.socket-connect.php) या यदि आपके सर्वर को देखने के टीसीपी का समर्थन करता है: // urn – Panagiotis

+2

पिंग आईसीएमपी का उपयोग करता है: http://php.net/manual/en/function.socket-create.php –

+0

@ पानागियोटिस वह यही कर रहा है ... –

उत्तर

59

मुझे लगता है कि this question का उत्तर आपके प्रश्न के साथ समस्या को काफी अधिक बताता है।

क्या तुम बाहर एक दिया मेजबान पोर्ट 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); 

टीसीपी के अलावा और कुछ इसे और अधिक मुश्किल हो जाएगा के लिए (हालांकि के बाद से आप 80 निर्दिष्ट करते हैं, मुझे लगता है कि आप एक सक्रिय HTTP सर्वर की तलाश में हैं, इसलिए टीसीपी वह है जो आप चाहते हैं)। टीसीपी अनुक्रमित और स्वीकृत है, इसलिए आप कनेक्शन को सफलतापूर्वक बनाते समय एक लौटा पैकेट प्राप्त करेंगे। अधिकांश अन्य परिवहन प्रोटोकॉल (आमतौर पर यूडीपी, लेकिन अन्य अच्छी तरह से) इस तरह से व्यवहार नहीं करते हैं, और डेटाग्राम नहीं होंगे जब तक ओवरलेड एप्लिकेशन लेयर प्रोटोकॉल लागू नहीं करता है।

तथ्य यह है कि आप इस सवाल से इस तरीके से पूछ रहे हैं कि आपको Transport Layer प्रोटोकॉल पर आपके ज्ञान में एक मौलिक अंतर है। आपको ICMP और TCP, साथ ही साथ OSI Model पर पढ़ना चाहिए।

इसके अलावा, यहां slightly cleaner संस्करण होस्ट करने के लिए पिंग करने के लिए है।

// Function to check response time 
function pingDomain($domain){ 
    $starttime = microtime(true); 
    $file  = fsockopen ($domain, 80, $errno, $errstr, 10); 
    $stoptime = microtime(true); 
    $status = 0; 

    if (!$file) $status = -1; // Site is down 
    else { 
     fclose($file); 
     $status = ($stoptime - $starttime) * 1000; 
     $status = floor($status); 
    } 
    return $status; 
} 
+0

नोट: यह लिंक किए गए प्रश्न से उद्धरण है, कृपया इसे संपादित न करें क्योंकि यह एक कोड स्वरूपण त्रुटि है। मैं आमतौर पर ऐतिहासिकता के लिए अपनी पोस्ट में लिंक से प्रासंगिक उद्धरण डालता हूं और लिंक रोट के मामले में, धन्यवाद! :) – ShadowScripter

+0

यह स्थानीयहोस्ट डोमेन – JackTurky

+0

के साथ काम नहीं करता है क्या यह आईपीवी 6 के साथ काम करेगा? – ihue

3

इस प्रयास करें:

echo exec('ping -n 1 -w 1 72.10.169.28'); 
+5

निष्पादन एक खतरनाक कार्य है और होना चाहिए डिफ़ॉल्ट रूप से आपके php.ini में अक्षम। – markus

+1

बंदरगाह के बारे में क्या है जहां आईएम गोना ने इसे – user1288533

+0

@ मार्कस-थर्कुन सहमत किया। लेकिन इसे संरक्षित करना संभव है। यदि आप बस आईपी जैसे इनपुट का उपयोग कर रहे हैं, आईपी को int में बदल दें और जो भी हो और इसे जांचें लेकिन हां यह सच है। –

-2

आप exec समारोह

exec("ping ".$ip); 
उपयोग कर सकते हैं

here एक उदाहरण

+2

exec एक खतरनाक फ़ंक्शन है और इसे डिफ़ॉल्ट रूप से आपके php.ini में अक्षम किया जाना चाहिए। – markus

+1

आप सही हैं, लेकिन कई बार निष्पादन समस्याओं को हल करने का एक आसान तरीका है: डी। निश्चित रूप से मुझे निष्पादन कार्य में रखे गए सभी चीज़ों को नियंत्रित और स्वच्छ करना होगा। – Jackie

+3

निष्पादन केवल खतरनाक है यदि आप –

2

आप किसी भी कार्यकारी या ऐसा करने की shell_exec हैक्स की जरूरत नहीं है, यह संभव है PHP में ऐसा करने के लिए। पुस्तक 'आप चाहते हैं कि PHP के साथ क्या करें?' केविन श्रोएडर द्वारा, शो कैसे है।

यह सॉकेट और pack() फ़ंक्शन का उपयोग करता है जो आपको बाइनरी प्रोटोकॉल को पढ़ने और लिखने देता है। आपको एक आईसीएमपी पैकेट बनाने की ज़रूरत है, जिसे आप अपने पैकेट बनाने के लिए 'CCnnnA *' प्रारूप का उपयोग करके कर सकते हैं।

+0

में उपयोगकर्ता इनपुट को अंधाधुंध रूप से फेंकने के लिए पर्याप्त पागल हैं, तो PHP [सॉकेट-मैनुअल पेज usernotes] पर सॉकेट_क्रेट के माध्यम से एक पिंग बनाने के सुझावों का एक पूरा समूह है (http://php.net /manual/en/function.socket-create.php#usernotes)। हालांकि इसे चलाने के लिए लिनक्स में रूट अनुमतियों की आवश्यकता होती है। – icc97

+3

एक बड़ा नोट। लिनक्स में एक आईसीएमपी पैकेट बनाने में सक्षम होने के लिए, आपको रॉ सॉकेट और पैकेट के साथ काम करना होगा, जिसके लिए प्रशासनिक prevs की आवश्यकता होती है। इसका मतलब है कि आपको ऐसा करने में सक्षम होने के लिए रूट के रूप में अपाचे चलाने की आवश्यकता है! । तब बस निष्पादित करना सुरक्षित है! –

13

मामले में ओपी वास्तव में, एक ICMP-पिंग चाहता था socket_create()[link] को उपयोगकर्ता योगदान नोट्स के भीतर कुछ प्रस्तावों, जो कच्चे सॉकेट का उपयोग कर रहे हैं। ध्यान रखें कि यूनिक्स पर सिस्टम जैसे रूट रूट की आवश्यकता है।

अपडेट: ध्यान दें कि usec तर्क विंडोज़ पर कोई फ़ंक्शन नहीं है। न्यूनतम टाइमआउट 1 सेकंड है।

किसी भी मामले में, इस शीर्ष के कोड मतदान पिंग समारोह है:

function ping($host, $timeout = 1) { 
    /* ICMP ping packet with a pre-calculated checksum */ 
    $package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost"; 
    $socket = socket_create(AF_INET, SOCK_RAW, 1); 
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0)); 
    socket_connect($socket, $host, null); 
    $ts = microtime(true); 
    socket_send($socket, $package, strLen($package), 0); 
    if (socket_read($socket, 255)) { 
     $result = microtime(true) - $ts; 
    } else { 
     $result = false; 
    } 
    socket_close($socket); 
    return $result; 
} 
+1

ओपी स्पष्ट रूप से बताता है कि वह एक पोर्ट – icc97

+1

का उपयोग करना चाहता है $ पैकेज var $$ = "\ x08 \ x00 \ x19 \ x2f \ x00 \ x00 \ x00 \ x00 \ x70 \ x69 \ x6e \ x67" में बदल गया है; जब आईपी का समय समाप्त हो गया तो विंडोज़ पर बेहतर परिणाम मिले। यह आपके लिंक में प्रलेखन से था। धन्यवाद – Hariboo

0

socket_create साथ एक UNIX सिस्टम पर रूट के रूप में चलाने के लिए की जरूरत है;

$socket = socket_create(AF_UNIX, SOCK_STREAM, 0); 
0

आप ICMP पैकेट php में आप इस Native-PHP ICMP ping implementation पर एक नज़र ले जा सकते हैं भेजना चाहते हैं, लेकिन मैं इसे परीक्षण नहीं किया।

2

टेस्ट विभिन्न बंदरगाहों:

$wait = 1; // wait Timeout In Seconds 
$host = 'example.com'; 
$ports = [ 
    'http' => 80, 
    'https' => 443, 
    'ftp' => 21, 
]; 

foreach ($ports as $key => $port) { 
    $fp = @fsockopen($host, $port, $errCode, $errStr, $wait); 
    echo "Ping $host:$port ($key) ==> "; 
    if ($fp) { 
     echo 'SUCCESS'; 
     fclose($fp); 
    } else { 
     echo "ERROR: $errCode - $errStr"; 
    } 
    echo PHP_EOL; 
} 


// Ping example.com:80 (http) ==> SUCCESS 
// Ping example.com:443 (https) ==> SUCCESS 
// Ping example.com:21 (ftp) ==> ERROR: 110 - Connection timed out 
1
function ping($ip){ 
    $output = shell_exec("ping $ip"); 
    var_dump($output); 
} 
ping('127.0.0.1'); 
+0

जबकि यह कोड प्रश्न का उत्तर दे सकता है, यह कुछ संदर्भ शामिल करना बेहतर होगा, यह बताएगा कि यह कैसे काम करता है और इसका उपयोग कब किया जाता है। कोड-केवल उत्तर लंबे समय तक उपयोगी नहीं होते हैं। – Bono

+0

shell_exec में अनचेक किए गए सुरक्षित पास आईपी नहीं .. – Hariboo

+0

धन्यवाद। इमो सुरक्षा संदर्भ पर निर्भर करती है: निश्चित रूप से हमेशा इनपुट की जांच करने की अनुशंसा की जाती है, लेकिन यह यहां विषय नहीं है। यहां मैं सबसे सरल कोड प्रदान करना चाहता हूं जो प्रश्न का उत्तर दे सके। वैसे भी, किसी भी सुझाव/संपादन का स्वागत है! – T30

संबंधित मुद्दे

 संबंधित मुद्दे