2013-12-03 31 views
5

Açıksa veya değil ise bağlantı noktasını taramak için kullanıyorum kodları.Soket döndürme yanlış sonucu kullanarak TCP bağlantı

https://stackoverflow.com/a/8957053/2203703

herkes lütfen düzeltmek için deneyebilir misiniz? o çıkışı kodları daima İşte

burada ben port 80

79.142.126.3 //Connection refused 
222.165.195.103 //Connection refused 
64.75.193.162 //Connection refused 
118.97.197.146 //Port is open 
222.134.154.103 //Connection timed out 
173.0.59.170 //Port is open 

ile test ettik ip listesi Ve "başarıyla bağlanmış" return, liman kapalı olsa dahi, doğru çalışmaz görünüyor :

5 sockets connected successfully 
79.142.126.3 connected successfully 
222.165.195.103 connected successfully 
64.75.193.162 connected successfully 
118.97.197.146 connected successfully 
173.0.59.170 connected successfully 

Kodlar iyi görünüyor, ama gerçekten sorunu bulamıyorum.

Herhangi bir yardım lütfen?

+1

, size bize vermedi neden Diğer cevaplardan biri (29 oy ve bir ödül ile olanı gibi)? –

+0

curl iyi, ancak soket de çok iyi, hızlı ve benim için en iyi seçenek. – user2203703

cevap

0

Bu kod,

Sadece echo "Created socket for $address\n" durumuna bağlı olduğunu ...

Sen echo "$count sockets connected successfully\n" ve echo "$address connected successfully\n" herhangi koşullara bağlı olmadığını görebilirsiniz .. ayrıca başarısızlık üzerine, yine "başarı ile" yazdırır ancak Bağlantı noktası kapalı olduğunda soket de oluşturulabilir.

Herhangi bir sorun görmüyorum. "X soketleri başarıyla bağlandı" genel mesajı yazdırılacaktır (bunu kaldırabilirsiniz ...) ancak "XXXXX başarıyla bağlandı" özel mesajı basılmayacaktır!

+0

Nasıl düzeltileceği hakkında bir fikrin var mı? Teşekkürler. – user2203703

+0

Güncellenmiş cevabımı görün. Bu seninle devlet değil mi? – MeNa

+0

@ user2203703 Lütfen ("$ adresleri" dizisine) koyduğunuzda, sadece bir tek IP adresi (ve bu IP adresinde 80 bağlantı noktası kapalı) koyduktan sonra kesin çıkışı göster. – MeNa

7

Bağlamadığınız kod, engellenmeyen G/Ç işlemlerinin birçok yönüyle ilgili sınırlı bir anlayışa sahip olduğumda, uzun zaman önce yazılmıştır.

Gerçekten bunun çok sayıda uygulama olduğu bir olay döngüsüne ihtiyacı var, ancak bu örnekte, @rdlowrey'un Alert kitaplığını kullanacağım, çünkü bu, anlaşılması oldukça kolay olması gereken minimalist bir koddur. Ayrıca daha yüksek seviye olan ve daha birçok özellik sunan React numaralı telefondan bir döngü de alabilirsiniz.

Not Aşağıdaki örnek PHP 5.4+

<?php 

// Array of addresses to test 
$addresses = [ 
    '192.168.5.150', 
    '192.168.5.152', 
    'google.com', // Important note: DNS is resolved synchronously here. 
    '192.168.5.155', // this can seriously slow down the process as it can block 
    '192.168.5.20', // for a few seconds, async DNS resolution is non-trivial 
    '192.168.40.40', // though 
]; 
// The TCP port to test 
$port = 80; 
// The length of time in seconds to allow host to respond 
$timeout = 5; 

// This will hold the results 
$lookups = []; 

// Create a reactor 
$reactor = (new \Alert\ReactorFactory)->select(); 

$count = count($addresses); 
$completedCount = 0; 

$onComplete = function($address, $result) 
        use(&$lookups, &$completedCount, $count, $reactor) { 

    // Cancel the watchers for this address 
    $reactor->cancel($lookups[$address]['failWatcher']); 
    $reactor->cancel($lookups[$address]['writeWatcher']); 
    $reactor->cancel($lookups[$address]['readWatcher']); 

    // Store the result 
    $lookups[$address] = $result; 

    // If there's nothing left to do, stop the reactor 
    if (++$completedCount == $count) { 
     $reactor->stop(); 
    } 
}; 

foreach ($addresses as $address) { 
    // Normalise the address to lower-case, as it will be used as an array key 
    $address = strtolower($address); 

    if (!isset($lookups[$address])) { 
     // Create a socket to connect asynchronously 
     $sockAddr = "tcp://{$address}:{$port}"; 
     $flags = STREAM_CLIENT_ASYNC_CONNECT; 
     $socket = stream_socket_client($sockAddr, $errNo, $errStr, 0, $flags); 
     stream_set_blocking($socket, 0); 

     // Set up a timeout to watch for failed connections 
     $failWatcher = function() use($address, $onComplete, $timeout) { 
      echo "{$address} connect failed: Connect timed out\n"; 
      $onComplete($address, false); 
     }; 
     $failWatcherId = $reactor->once($failWatcher, $timeout); 

     // Watch for the stream becoming writable (connection success) 
     $writeWatcher = function() use($address, $onComplete) { 
      echo "{$address} connected successfully\n"; 
      $onComplete($address, true); 
     }; 
     $writeWatcherId = $reactor->onWritable($socket, $writeWatcher); 

     // Watch for the stream becoming readable (success or explicit fail) 
     $readWatcher = function() use($address, $onComplete, $socket) { 
      if ('' === $data = fread($socket, 1024)) { 
       echo "{$address} connect failed: Server refused connection\n"; 
       $onComplete($address, false); 
      } else if ($data === false) { 
       echo "{$address} connect failed: Stream read error\n"; 
       $onComplete($address, false); 
      } else { 
       echo "{$address} connected successfully\n"; 
       $onComplete($address, true); 
      } 
     }; 
     $readWatcherId = $reactor->onReadable($socket, $readWatcher); 

     // Store the watcher IDs so they can be destroyed later 
     $lookups[$address] = [ 
      'failWatcher' => $failWatcherId, 
      'writeWatcher' => $writeWatcherId, 
      'readWatcher' => $readWatcherId, 
     ]; 
    } 
} 

// Set everything going 
$reactor->run(); 

// $lookups is now an array of booleans indicating whether the address resulted 
// in a successful connection 
0

gerektirdiğini o zaman kodunuzu kolaylaştırabilirsiniz (daha sonra paralel yavaş belli ki,) IPS sırayla test etmek ve socket_connect işlevinden yararlı bir tepki olması gelemez :

<?php 

    // An array of hosts to check 
    $addresses = array(
    '79.142.126.3', //Connection refused 
    '222.165.195.103', //Connection refused 
    '64.75.193.162', //Connection refused 
    '118.97.197.146', //Port is open 
    '222.134.154.103', //Connection timed out 
    '173.0.59.170' //Port is open 
); 

    // The TCP port to test 
    $testport = 80; 
    // The length of time in seconds to allow host to respond 
    $timeout = 5; 

    foreach ($addresses as $address) { 

    if (!$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) { 
     echo "Could not create socket for $address\n"; 
     continue; 
    } 

    socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0)); 
    socket_set_option($sock, SOL_SOCKET, SO_SNDTIMEO, array('sec' => $timeout, 'usec' => 0)); 

    if (@socket_connect($sock, $address, $testport)) { 
     echo "$address connected successfully\n"; 
    } 
    else { 
     echo "Unable to connect to $address\n"; 
    } 
    } 

Yanıt: merak dışında

Unable to conenct to 79.142.126.3 
Unable to conenct to 222.165.195.103 
Unable to conenct to 64.75.193.162 
118.97.197.146 connected successfully 
Unable to conenct to 222.134.154.103 
173.0.59.170 connected successfully 
İlgili konular