Sender Message

I'm new to socket connections, I want to send some commands to the socket server, but I can just send the first message to no other.

Customer:

$fp = stream_socket_client("tcp://127.0.0.1:1000", $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { $cmd_1 = "hello"; fwrite($fp, $cmd_1); while (!feof($fp)) { print_r(fgets($fp, 1024)); } $cmd_2 = "second message"; fwrite($fp, $cmd_2); while (!feof($fp)) { print_r(fgets($fp, 1024)); } fclose($fp); } 

How can I send several messages, for example, the first $cmd_1 , and depending on the result, I need to send $cmd_2 ?

Server

 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 = '127.0.0.1'; $port = 1000; if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) { echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; } if (socket_bind($sock, $address, $port) === false) { echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; } if (socket_listen($sock, 5) === false) { echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; } do { if (($msgsock = socket_accept($sock)) === false) { echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\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, PHP_NORMAL_READ))) { echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\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); 
+4
source share
2 answers

The problem is on the following line:

 while (!feof($fp)) { 

What it is: it waits for EOF on this socket (usually the socket closes). It receives the first response and waits for a response without sending any further requests (while looping). Do you want to read the response message for each request message you send?

Change your code as follows (untested, but it should work):

 $cmd_1 = "hello"; fwrite($fp, $cmd_1); print_r(fgets($fp, 1024)); $cmd_2 = "second message"; fwrite($fp, $cmd_2); print_r(fgets($fp, 1024)); fclose($fp); 

fgets(..) will return as soon as the string is read from the socket. You really don't need a while loop.


Also, this is a good time to start defining the structure / protocol for your messages. On the client side, you read line by line, but not the server. The socket (on the server) reads may return with a partial message. If you decide the communication structure, you can configure the readings so that they do not return until the entire structure has been read.

0
source

The problem is

 if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) { echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n"; break 2; } 

instead of comparing with false do === ''

 if ('' === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) { echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n"; break 2; } 

because otherwise the connection closes prematurely - see here - http://www.php.net/manual/en/function.socket-read.php#89133

0
source

All Articles