Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: fsockopen zamiast ping ?
Forum PHP.pl > Forum > PHP
carramba
Panowie mam następujący problem, na niektórych serwerach
funkcje systemowe typu exec, czy passthru sa zabkowane więc,
normalnego pinga nie wykonam. I tu pojawia się pomysł z wykorzystaniem
gniazd tyle tylko że coś takiego :

  1. <?php
  2. $fp = @fsockopen(&#092;"udp://$ip\", 13, $errno, $errstr);
  3. if ($fp) { 
  4.        $obrazek = 'system_on'; 
  5. } else { 
  6.        $obrazek = 'system_off'; 
  7. } 
  8. fclose ($fp); 
  9. ?>


zupełnie nie działa, ma ktoś z was może pomysł co robię źle ?
Seth
Czy przypadkiem ping nie siedzi na porcie 7 ?
Poza tym musisz wyslach bodajze \0 na ten port i czekac na zwrot.
Sh4dow
Zajzalem w trzewia boga manuala i ujzalem stwora:
  1. <?php
  2.  
  3. class Net_Ping
  4. {
  5. var $icmp_socket;
  6. var $request;
  7. var $request_len;
  8. var $reply;
  9. var $errstr;
  10. var $time;
  11. var $timer_start_time;
  12. function Net_Ping()
  13. {
  14.  $this->icmp_socket = socket_create(AF_INET, SOCK_RAW, 1);
  15.  socket_set_block($this->icmp_socket);
  16. }
  17.  
  18. function ip_checksum($data)
  19. {
  20.  for($i=0;$i<strlen($data);$i += 2)
  21.  {
  22.  if($data[$i+1]) $bits = unpack('n*',$data[$i].$data[$i+1]);
  23.  else $bits = unpack('C*',$data[$i]);
  24.  $sum += $bits[1];
  25.  }
  26.  
  27.  while ($sum>>16) $sum = ($sum & 0xffff) + ($sum >> 16);
  28.  $checksum = pack('n1',~$sum);
  29.  return $checksum;
  30. }
  31.  
  32. function start_time()
  33. {
  34.  $this->timer_start_time = microtime();
  35. }
  36.  
  37. function get_time($acc=2)
  38. {
  39.  // format start time
  40.  $start_time = explode (&#092;" \", $this->timer_start_time);
  41.  $start_time = $start_time[1] + $start_time[0];
  42.  // get and format end time
  43.  $end_time = explode (&#092;" \", microtime());
  44.  $end_time = $end_time[1] + $end_time[0];
  45.  return number_format ($end_time - $start_time, $acc);
  46. }
  47.  
  48. function Build_Packet()
  49. {
  50.  $data = &#092;"abcdefghijklmnopqrstuvwabcdefghi\"; // the actual test data
  51.  $type = &#092;"x08\"; // 8 echo message; 0 echo reply message
  52.  $code = &#092;"x00\"; // always 0 for this program
  53.  $chksm = &#092;"x00x00\"; // generate checksum for icmp request
  54.  $id = &#092;"x00x00\"; // we will have to work with this later
  55.  $sqn = &#092;"x00x00\"; // we will have to work with this later
  56.  
  57.  // now we need to change the checksum to the real checksum
  58.  $chksm = $this->ip_checksum($type.$code.$chksm.$id.$sqn.$data);
  59.  
  60.  // now lets build the actual icmp packet
  61.  $this->request = $type.$code.$chksm.$id.$sqn.$data;
  62.  $this->request_len = strlen($this->request);
  63. }
  64.  
  65. function Ping($dst_addr,$timeout=5,$percision=3)
  66. {
  67.  // lets catch dumb people
  68.  if ((int)$timeout <= 0) $timeout=5;
  69.  if ((int)$percision <= 0) $percision=3;
  70.  
  71.  // set the timeout
  72.  socket_set_option($this->icmp_socket,
  73.  SOL_SOCKET, // socket level
  74.  SO_RCVTIMEO, // timeout option
  75.  array(
  76.  &#092;"sec\"=>$timeout, // Timeout in seconds
  77.  &#092;"usec\"=>0 // I assume timeout in microseconds
  78.  )
  79.  );
  80.  
  81.  if ($dst_addr)
  82.  {
  83.  if (@socket_connect($this->icmp_socket, $dst_addr, NULL))
  84.  {
  85.  
  86.  } else {
  87.  $this->errstr = &#092;"Cannot connect to $dst_addr\";
  88.  return FALSE;
  89.  }
  90.  $this->Build_Packet();
  91.  $this->start_time();
  92.  socket_write($this->icmp_socket, $this->request, $this->request_len);
  93.  if (@socket_recv($this->icmp_socket, &$this->reply, 256, 0))
  94.  {
  95.  $this->time = $this->get_time($percision);
  96.  return $this->time;
  97.  } else {
  98.  $this->errstr = &#092;"Timed out\";
  99.  return FALSE;
  100.  }
  101.  } else {
  102.  $this->errstr = &#092;"Destination address not specified\";
  103.  return FALSE;
  104.  }
  105. }
  106. }
  107.  
  108. $ping = new Net_Ping;
  109. $ping->ping(&#092;"www.google.ca\");
  110.  
  111. if ($ping->time)
  112. echo &#092;"Time: \".$ping->time;
  113. else
  114. echo $ping->errstr;
  115.  
  116. ?>


trzewia jego nie powiedziala co zrobic, to juz musisz sam zadecydowac, ja tylko pokazalem
FiDO
Cytat(Seth @ 2004-07-06 20:03:06)
Czy przypadkiem ping nie siedzi na porcie 7 ?

Gwoli ścisłości, ping dziala na protokole ICMP a nie TCP/UDP, w ICMP nie ma portow.. a rozwiazanie widze juz podal Sh4dow
Indianin
Cytat
rozwiazanie widze juz podal Sh4dow
tylko gdy jest włączona funkcja socket_create() . Mam pecha
Sh4dow
przeszukaj manuala moze cos znajdziesz, najbardziej wartosciowe sa komentarze
Indianin
Próbowałem kilanaście skryptów do pingowania . żaden na moim servie nie działa . Na localu i kilu testowych kontach działały .
Czy funkcjie pingujące są niebezpieczne czy jaki diabeł ?. Dlaczego providerzy wyłączają je .?
Dabroz
A czy funkcja mail jest niebezpieczna?? A jest czesto wylaczana na darmowych kontach... (spam, of course)

A może skoro funkcje są pozamykane, to może warto skorzystać z jakiegoś zdalnego skryptu?
carramba
very nice działa jak należy, bardzo dziękuje.
hmmm rozumiem ze blokowanie exec jest
konieczne, ale czasami amdinistratorzy systemow
po prostu przeginają z tym bezpieczeństwem.
Chewolf
Ja mialem podobny problem, musialem sprawdzic jakie serwery GG dzialaja. Uzywalem podobnego skryptu, lecz nie dzialal lub zle dzialal. Okazalo sie ze trzeba tylko zmienic port na 8074 tongue.gif Link
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.