|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2007-11-18 23:12 UTC] mertcan at dpozitif dot com
Description:
------------
Using feof on UDP hangs. It should give true or false, in my example it should give true but it hangs. I've tried many ways but it always hangs.
Reproduce code:
---------------
$msg = "????challenge rcon";
$fp = fsockopen("udp://62.68.207.16",27015, $errno, $errstr);
fputs($fp, $msg, strlen($msg));
$response = fgets($fp, 1024);
$challenge = substr($response, 19, strlen($response) - 20);
$msg = "????rcon ".$challenge." \"123456\" ".$komut.chr(0);
fputs($fp, $msg, strlen($msg));
echo feof($fp) ? 'true':'false';
$response .= fgets($fp, 32);
fclose ($fp);
Expected result:
----------------
true
Actual result:
--------------
hangs
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Nov 03 04:00:01 2025 UTC |
It still hangs: $fp = fsockopen("udp://".$ip,$port, $errno, $errstr); stream_set_blocking($fp, 0);i gave $tanim in function use: function rcon_komut($komut, $rcon_pass, $ip, $port) { $msg = "????challenge rcon"; $fp = fsockopen("udp://".$ip,$port, $errno, $errstr); stream_set_blocking($fp, 0); fputs($fp, $msg, strlen($msg)); $response = fgets($fp, 1024); $challenge = substr($response, 19, strlen($response) - 20); $msg="????rcon".$challenge."\"".$rcon_pass."\"".$komut.chr(0); fputs($fp, $msg, strlen($msg)); while (!feof($fp)) $response .= fgets($fp, 32); fclose ($fp); $response = substr($response, 6, strlen($response)-6); return $response; }Here is the full program: <?php echo rcon_komut("meta list", "123456", "62.68.207.16", 27015); function rcon_komut($komut, $rcon_pass, $ip, $port) { $response = ""; $msg = "????challenge rcon"; $fp = fsockopen("udp://".$ip,$port, $errno, $errstr); stream_set_blocking($fp, 0); fputs($fp, $msg, strlen($msg)); $response = fgets($fp, 1024); $challenge = substr($response, 19, strlen($response) - 20); $msg="????rcon".$challenge."\"".$rcon_pass."\"".$komut.chr(0); fputs($fp, $msg, strlen($msg)); while (!feof($fp)) $response .= fgets($fp, 4096); fclose ($fp); return $response; } ?>actually if i set stream_set_blocking for $fp to 1 it gives the result (which i posted the code below) if i change stream_set_blocking to 0, it does not give any result. in either ways if i use feof($fp) it hangs.. <?php echo rcon_komut("meta list", "123456", "62.68.207.16", 27015); function rcon_komut($komut, $rcon_pass, $ip, $port) { $response = ""; $msg = "????challenge rcon"; $fp = fsockopen("udp://".$ip,$port, $errno, $errstr); stream_set_blocking($fp, 1); fputs($fp, $msg, strlen($msg)); $response .= fgets($fp, 1024); fclose ($fp); return $response; } ?>Your script was buggy, this works: <?php echo rcon_komut("meta list", "123456", "62.68.207.16", 27015); function rcon_komut($komut, $rcon_pass, $ip, $port) { $fp = fsockopen("udp://".$ip,$port, $errno, $errstr); socket_set_timeout($fp, 3); $prefix = "\xff\xff\xff\xff"; $msg = "{$prefix}challenge rcon\n"; fputs($fp, $msg, strlen($msg)); $response = fgets($fp, 1024); $challenge = substr($response, 19, strlen($response) - 20); $msg = "\xff\xff\xff\xffrcon $challenge \"$rcon_pass\" $komut\n"; fputs($fp, $msg, strlen($msg)); $status = socket_get_status($fp); while($status['unread_bytes']) { $response .= fgets($fp, 2048); $status = socket_get_status($fp); } fclose ($fp); return $response; } ?> Using feof() makes no sense with udp streams..