Re: Maintaing socket connections across page requests
Posted: Mon Sep 01, 2008 3:37 pm
bump... anyone else have thoughts on this? I'm stumped. 
A community of PHP developers offering assistance, advice, discussion, and friendship.
http://forums.devnetwork.net/
Code: Select all
<?php
if(sizeof($_POST) > 0){
$ip = '192.168.1.100';
$port = 11111;
if(($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false){
echo "<br>Problem creating socket: " . socket_strerror(socket_last_error()) . "<br>";
}
echo "Attempting to connect to '$ip' on port '$port'...";
if(($client = socket_connect($sock, $ip, $port)) === false){
echo "<br>Problem connecting to socket: " . socket_strerror(socket_last_error()) . "<br>";
}
else{
[color=#00FF00] // notice I'm tacking on the '\n' to the string being sent to the server.[/color]
[color=#00FF00] // is this what you were talking about, by terminate every command sent to the[/color]
[color=#00FF00] // server with a newline?[/color]
socket_write($sock, $_POST['strText'] . '\n', strlen($_POST['strText']));
[color=#00FF00] // immediately check for the response from the server.[/color]
if (($buf = socket_read($sock, 2048, PHP_NORMAL_READ)) === false) {
echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($sock)) . "<br>";
}
else{
[color=#40FF00]//after having read the response from the server looking for 'Ok/n'[/color]
$buf = trim($buf);
echo $buf . "<br>";
if($buf == "Ok\n"){
socket_close($sock);
}
}
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Gridborg Client</title>
</head>
<body>
<form name="f" method="post" action="GridborgClient.php">
<input type="text" name="strText" value=""><br />
<input type="submit" value="submit">
</form>
</body>
</html>Code: Select all
<?
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 = '192.168.1.100';
$port = 11111;
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";
}
print("Waiting for connection...");
while (true){
if (($msgsock = socket_accept($sock)) === false) {
echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
break;
}
/* Send instructions. */
$msg = "\n\rWelcome to the PHP Test Server.\n\r" . "To quit, type 'quit'. To shut down the server type 'shutdown'.\n\r";
socket_write($msgsock, $msg, strlen($msg));
while(true) {
if (($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ)) === false) {
echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n\r";
break 2;
}
if (!$buf = trim($buf)) {
continue;
}
switch($buf){
case 'quit':
break 2;
case 'shutdown':
socket_close($msgsock);
break 3;
case 'openGridSock':
// code to open the socket
$ip = 'xxx.xxx.xxx.xxx'; // hidden for security
$port = 1234;
if(($GridSock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false){
$errmsg = "Problem creating socket: " . socket_strerror(socket_last_error());
socket_write($msgsock, $errmsg, strlen($errmsg));
}
if(($client = socket_connect($GridSock, $ip, $port)) === false){
$errmsg = "Problem connecting to socket: " . socket_strerror(socket_last_error());
socket_write($msgsock, $errmsg, strlen($errmsg));
}
else{
$connectmsg = "Connected.\n\r";
socket_write($msgsock, $connectmsg, strlen($connectmsg));
$GridResponse = socket_read($GridSock, 1024);
socket_write($msgsock, $GridResponse, strlen($GridResponse));
}
break;
case 'closeGridSock':
$closemsg = "Connection closed.";
socket_close($GridSock);
socket_write($msgsock, $closemsg, strlen($closemsg));
break;
default:
/* check for talkback command */
if(substr($buf,0,3) == 'tb:'){
$talkback = "You said: " . substr($buf,3,strlen($buf));
socket_write($msgsock, $talkback, strlen($talkback));
[color=#40FF00]//sending back an 'Ok/n' as dml suggested[/color]
socket_write($msgsock,"Ok/n",strlen("Ok/n"));
}
else{
// we did not get a specific daemon command so assume what was typed was a gridborg command and write it to the GridSock socket.
socket_write($GridSock, $buf, strlen($buf));
// imeadately read the gridborg's response and write that message back out to the client
$GridResponse = socket_read($GridSock, 1024);
socket_write($msgsock, $GridResponse, strlen($GridResponse));
}
break;
}
}
socket_close($msgsock);
}
?>Code: Select all
while(($GridResponse = trim(socket_read($GridSock, 2048, PHP_BINARY_READ))) <> ''){
echo "GridResponse is: " . $GridResponse . "\r\n";
echo "writing back Gridborg Response...\r\n";
$numbytes = socket_write($msgsock, $GridResponse);
echo "number of bytes written: " . $numbytes . "\r\n";
echo "Will I even see this the second time?\r\n";
}
... and it hangs right there... it never drops out of the loop.GridResponse is: ROK 75
writing back Gridborg Response...
number of bytes written: 6
Will I even see this the second time?
GridResponse is: ESessionCreated 75
writing back Gridborg Response...
number of bytes written: 18
Code: Select all
$i = 0;
while(true){
$GridResponse = trim(socket_read($GridSock, 2048, PHP_BINARY_READ));
echo "i is: " . $i . "\r\n";
echo "GridResponse is: " . $GridResponse . "\r\n";
echo "writing back Gridborg Response...\r\n";
$numbytes = socket_write($msgsock, $GridResponse);
echo "number of bytes written: " . $numbytes . "\r\n";
$i++;
if($i == 2){
break;
[color=#800000]// i've even tried replacing 'break;' with 'continue;' to see if I could get the loop to go one more time![/color]
}
echo "Will I even see this the second time?\r\n";
}
Code: Select all
while(true){
$GridResponse = trim(socket_read($GridSock, 2048, PHP_BINARY_READ));
echo "GridResponse is: " . $GridResponse . "\r\n";
if(strlen($GridResponse) == 0){
break;
}
else{
echo "writing back Gridborg Response...\r\n";
$numbytes = socket_write($msgsock, $GridResponse);
echo "number of bytes written: " . $numbytes . "\r\n";
}
}
I'm so close I can taste it! I hope someone can help me out hereGridResponse is: ROK nn
writing back Gridborg Response...
number of bytes written: 6
Will I even see this the second time?
GridResponse is: ESessionCreated nn
writing back Gridborg Response...
number of bytes written: 18