jak zabezieczyc sie przed zapetleniem programu?, fsockopen

0

@topic jak zabezieczyc sie przed zapetleniem programu?, fsockopen + pusta odp servera

witam

mam problem ze skryptem do sprawdzania statusu servera do gry

skrypt dizala tak:

laczy sie z serverem poprzez fsockopen
potem jak server jest online wysyla mu bajtow anych, server z gra odpowiada i generuje plik XML , wsyzstkie inne servery (nie do gry)[np http] nie generuja xmla i petla while mi sie zapetla az wywala blad po 60 sec

kod funkcji

function otserv_info($host = 'localhost', $port = 7171) 
{
  $sock = @fsockopen($host, $port, $errno, $errstr, 1); 
  if($sock) 
  {
    fwrite($sock, chr(6).chr(0).chr(255).chr(255).'info'); 
    while(!feof($sock)) 
      $data .= fgets($sock, 1024);
    fclose($sock); 
    
    $xml_parser = xml_parser_create();
    xml_parse_into_struct($xml_parser, $data, $vals, $index);
    xml_parser_free($xml_parser);
    
    $otserv = array(
      'status' => 1,
      'uptime' => $vals[1]['attributes']['UPTIME'],
      'name' => $vals[1]['attributes']['SERVERNAME'],
      'from' => $vals[1]['attributes']['LOCATION'],
      'url' => $vals[1]['attributes']['URL'],
      'source' => $vals[1]['attributes']['SERVER'].' ('.$vals[1]['attributes']['VERSION'].')',
      'playersonline' => $vals[3]['attributes']['ONLINE'],
      'playersmax' => $vals[3]['attributes']['MAX'],
      'info' => $vals[6]['value']
    );
  } 
  else 
  { 
    $otserv = array(
      'status' => 0,
      'errno' => $errno,
      'errstr' => $errstr
    ); 
  }

  return $otserv;
}

gdy wywoluje ja tak:

print_r(otserv_info('www.guia3d.com'));

wszystko jest ok, bo to server gry
lecz gdy wywolam np server www

print_r(otserv_info('www.wp.pl', 80));

zapetla sie i wywala error

jak to naprawic ?
myslalem zeby usunac petle ale nie mam pomyslu czym ja zastapic.

0

przed pętlą:

  stream_set_timeout($sock, 2); // dwie sekundy oczekiwania

i pętla się przerwie jeśli w ciągu 2 sekund nie dostanie odpowiedzi
żeby sprawdzić czy z pętli wyszło normalnie czy czas się skończył możesz zobaczyć:

 $a = stream_get_meta_data($sock);
if($a['timed_out']){
  echo 'koniec czasu';
  return false;
}
0

cos nie zabardzo

Warning:  stream_get_meta_data(): 2 is not a valid stream resource in index.php on line 38
Fatal error:  Maximum execution time of 60 seconds exceeded in index.php on line 10
0

pokaż kod ?

0
function otserv_info($host = 'localhost', $port = 7171) 
{
  $sock = @fsockopen($host, $port, $errno, $errstr, 1); 
  if($sock) 
  {
    fwrite($sock, chr(6).chr(0).chr(255).chr(255).'info');
	stream_set_timeout($sock, 2); // dwie sekundy oczekiwania
    while(!feof($sock)) 
      $data .= fgets($sock, 1024);
    fclose($sock); 
    
    $xml_parser = xml_parser_create();
    xml_parse_into_struct($xml_parser, $data, $vals, $index);
    xml_parser_free($xml_parser);
    
    $otserv = array(
      'status' => 1,
      'uptime' => $vals[1]['attributes']['UPTIME'],
      'name' => $vals[1]['attributes']['SERVERNAME'],
      'from' => $vals[1]['attributes']['LOCATION'],
      'url' => $vals[1]['attributes']['URL'],
      'source' => $vals[1]['attributes']['SERVER'].' ('.$vals[1]['attributes']['VERSION'].')',
      'playersonline' => $vals[3]['attributes']['ONLINE'],
      'playersmax' => $vals[3]['attributes']['MAX'],
      'info' => $vals[6]['value']
    );
  } 
  else 
  { 
    $otserv = array(
      'status' => 0,
      'errno' => $errno,
      'errstr' => $errstr
    ); 
  }

  $a = stream_get_meta_data($sock);
if($a['timed_out']){
  return 'koniec czasu';
} else
  return $otserv;
}
0

nie możesz stosować stream_get_meta_data na $sock po jego zamknięciu (fclose($sock)) - poza tym nie wiem

0

to jeszcze jakies inne sugestje ? ):

1 użytkowników online, w tym zalogowanych: 0, gości: 1