I really appreciate the suggestions so far with my socket client problem. Somebody suggested I repost the issue with the program flow and code, to clarify the situation (a good idea). So here it is:
To sumarrize: My socket client runs fine when all it does is (1) wait for data from the server (2) respond to server message (3) then wait again (ad infinitum). E.g.,
---THIS WORKS---------------------- Setup and open TCP socket Send a Password_DS to the Server Send a Resend_DS to the Server Enter infinite loop: Wait for messages from the Server Upon receipt of a Send_DS from the Server Respond with a Send_DS_Ack Upon receipt of a Ping_DS from the Server Respond with a Ping_DS_Ack Upon receipt of a Status_DS from the Server Respond with a Status_DS_Ack ---THIS WORKS----------------------
Again, the client loops fine and works well—UNTIL I I try to add one feature: If the Server doesn't send a message for more than five seconds, the socket_read should send Ping_DS to the Server to see if it's still alive, and then, if it is, continue to the top of the loop and wait for another message from the Server.
---THIS DOESN'T WORK---------------------- Setup and open TCP socket Send a Password_DS to the Server Send a Resend_DS to the Server Enter infinite loop: Wait for messages from the Server Upon receipt of a Send_DS from the Server Respond with a Send_DS_Ack Upon receipt of a Ping_DS from the Server Respond with a Ping_DS_Ack Upon receipt of a Status_DS from the Server Respond with a Status_DS_Ack -> Periodically, send a Ping_DS to the Server -> If the Ping_DS transmit fails -> Clean-up and restart the socket connection -> If a Ping_DS_Ack is not received from the Server -> Clean-up and restart the socket connection ---THIS DOESN'T WORK----------------------
---PROGRAM OUTPUT---------------------- Socket created. Socket connected to 192.168.0.13:9500.
SERVER <- CLIENT: 18 (PASSWORD_DS) SERVER -> CLIENT: 19 (PASSWORD_DS_ACK)
SERVER <- CLIENT: 3 (RESEND_DS)
MESSAGE RECEIVED
SERVER -> CLIENT: 23 (STATUS_DS) SERVER <- CLIENT: 24 (STATUS_DS_ACK)
MESSAGE RECEIVED
SERVER -> CLIENT: 16 (RESEND_DS_ACK)
PHP Warning: socket_read() unable to read from socket [35]: Resource temporarily unavailable in /Users/rene/Sites/gpspolice/titan/cr.php on line 65
Warning: socket_read() unable to read from socket [35]: Resource temporarily unavailable in /Users/rene/Sites/gpspolice/titan/cr.php on line 65
PHP Warning: socket_read() unable to read from socket [35]: Resource temporarily unavailable in /Users/rene/Sites/gpspolice/titan/cr.php on line 65
Warning: socket_read() unable to read from socket [35]: Resource temporarily unavailable in /Users/rene/Sites/gpspolice/titan/cr.php on line 65
---PROGRAM OUTPUT----------------------
---MY CODE (WHICH DOESN'T WORK)---------------------- $msg_recv = 3; $timeout = array('sec' => 5, 'usec' => 0);
// ENTER LOOP
do { $data = ""; socket_set_block($socket); socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,$timeout); while(($buf = socket_read($socket,128,PHP_BINARY_READ)) !== false) { $data .= $buf;
if(preg_match("/ENX/",$data)) { $msg_recv = 1; break; } elseif ($error = socket_last_error($socket)) { $msg_recv = 0; echo "\nTIMEOUT: SOCKET ERROR [$error]:" . socket_strerror($error); break; } }
if ($msg_recv == 1) {
echo "\n\n\nMESSAGE RECEIVED\n";
// RECEIVED MESSAGE $msg_type = get_msg_type($data); recv_msg($msg_type); // RESPONSE switch ($msg_type) { case 1: // SEND_DS -- PROCESS MESSAGE, RESPOND $msg_body = get_msg_body($data); send_msg("",$cn["SEND_DS_ACK"]); break; case 13: // PING_DS -- RESPOND send_msg("",$cn["PING_DS_ACK"]); break; case 23: // STATUS_DS -- UP AND RUNNING -- RESPOND send_msg("",$cn["STATUS_DS_ACK"]); break; case 16: // RESEND_DS_ACK -- DO NOTHING break; case 25: // DISCONNECT_DS -- ACKNOWLEDGE, CLOSE SOCKET, REOPEN socket_close($socket); $connection = false; break; } $msg_recv = 3; } elseif ($msg_recv == 0) {
echo "\n\n\nTIMEOUT: MESSAGE NOT RECEIVED\n"; $msg_recv = 3; }
} while ($connection == true); ---MY CODE WHICH DOESN'T WORK----------------------
-- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php