|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2002-04-27 14:41 UTC] webmaster at red-sub-tech dot ws
The socket_read() function does not work properly, say I do this: $text = socket_read($message_socket, 2048); It will only get 1 character even though I said 2048 characters. PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 21:00:01 2025 UTC |
Note this script was taken DIRECTLY from the PHP Manual (which you guys have yet to update with the new socket fixes). And I used this in Windows with a batch file (only one line on the batch file: @c:\PHP\php-cli.exe -q c:\php\server.php ) Script: error_reporting (E_ALL); /* Allow the script to hang around waiting for connections. */ set_time_limit (0); /* Turn on implicit output flushing so we see what we're getting * as it comes in. */ ob_implicit_flush (); $address = 'xxx.xxx.x.xxx; $port = 10000; if (($sock = socket_create (AF_INET, SOCK_STREAM, 0)) < 0) { echo "socket_create() failed: reason: " . socket_strerror ($sock) . "\n"; } if (($ret = socket_bind ($sock, $address, $port)) < 0) { echo "socket_bind() failed: reason: " . socket_strerror ($ret) . "\n"; } if (($ret = socket_listen ($sock, 5)) < 0) { echo "socket_listen() failed: reason: " . socket_strerror ($ret) . "\n"; } do { if (($msgsock = socket_accept($sock)) < 0) { echo "socket_accept() failed: reason: " . socket_strerror ($msgsock) . "\n"; break; } /* Send instructions. */ $msg = "\nWelcome to the PHP Test Server. \n" . "To quit, type 'quit'. To shut down the server type 'shutdown'.\n"; socket_write($msgsock, $msg, strlen($msg)); do { if (FALSE === ($buf = socket_read ($msgsock, 2048))) { echo "socket_read() failed: reason: " . socket_strerror ($ret) . "\n"; break 2; } if (!$buf = trim ($buf)) { continue; } if ($buf == 'quit') { break; } if ($buf == 'shutdown') { socket_close ($msgsock); break 2; } $talkback = "PHP: You said '$buf'.\n"; socket_write ($msgsock, $talkback, strlen ($talkback)); echo "$buf\n"; } while (true); socket_close ($msgsock); } while (true); socket_close ($sock);I had spent many hours leading with that same socket_read() bugs, in Windows 2000 SP4. A way to "by-pass" the bugs is getting bytes in a loop, and omitting 'type' at socket_read() call. See the following simple telnet server: set_time_limit (0); ob_implicit_flush (); $host = "127.0.0.1"; $port = 4100; $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n"); socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1); $ret = socket_bind($socket, $host, $port) or die("Could not bind to socket\n"); $ret = socket_listen($socket, 30000) or die("Could not set up socket listener\n"); $client = socket_accept($socket) or die("Could not accept incoming connection\n"); $welcome = "\n\rWelcome!"; socket_write($client, $welcome, strlen ($welcome)) or die("Could not send connect string\n"); while(1) { /* Ask for next input */ $output = "\n\n\rWaiting for request ('quit' to end)... "; socket_write($client, $output, strlen($output)) or die("Could not write output\n"); /* Get user message. Warning: socket_read does NOT works here if third parameter is given */ $input = ''; while(ord($i = socket_read($client, 1024)) != 13) { $input .= $i; socket_write($client, $i, 1) or die("Could not write output\n"); } /* End session? */ if($input=="quit") { break; } /* Out message back */ $output = "\n\n\rYou say '$input'"; socket_write($client, $output, strlen($output)) or die("Could not write output\n"); } socket_close($client); socket_close($socket);