Hello everyone,

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



Reply via email to