Gå til innhold

[LØST] Socket med "keepalive"


Anbefalte innlegg

Hei

 

Håper det er noen som kan hjelpe meg med denne...

 

Holder på å lage et tracking system hvor en gpstracker sender posisjoner over GPRS til en webserver via en service.

Etter sendt posisjon, sender tracker også <KeepAlive> som scriptet da responderer med <KeepAlive/>.

Problemet er at jeg får "disconnected by remote host" umiddelbart etter responsen, men ønsker da at dette skal gå i en loop hvor client ikke blir disconnected..

 

 

 

if ($argv[1] == 'run') {
 win32_start_service_ctrl_dispatcher('GPRSService');

 while (WIN32_SERVICE_CONTROL_STOP != win32_get_last_control_message()) {
 usleep(250000);

$stop = true;
while($stop){

$address = "xx.xx.xx.xx"; 
$port = xxxx; 

$mysock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 

socket_bind($mysock,$address, $port) or die('Could not bind to address');  
socket_listen($mysock, 5); 
$client = socket_accept($mysock); 

// read 1024 bytes from client 
$input = socket_read($client, 1024);

// KeepAlive
if (preg_match("<KeepAlive>", $input)) {
	$output='<?xml version="1.0" encoding="UTF-8"?><KeepAlive/>';
	// write data back to socket server
	socket_write($client,$output,strlen($output));
	echo $output;
	echo "\n\n";
	}else{
	$output='Data mottatt...';
	// write data back to socket server
	socket_write($client,$output,strlen($output));
	echo $output;
	echo "\n\n";
}


socket_close($client); 
socket_close($mysock);
}

}
}

Endret av Teobald
Lenke til kommentar
Videoannonse
Annonse
Gjest Slettet+1298342134

Tja, kan starte med noe småting:

 

Flytt dette så det ikke er inni while loopen din, dvs etter den.

       // Det er denne som gir deg disconnected by remote host med en gang.
       socket_close($client); 
       // Og denne stenger ned server socketen din så du ikke får koblet til igjen senere
       // så denne må et stykke lenger ut.
       socket_close($mysock);

 

Flytt dette over while loopen, ikke mye vits å prøve å starte en ny server socket hver gang vi er ferdig å lese litt data fra klienten.

       $address = "xx.xx.xx.xx"; 
       $port = xxxx; 

       $mysock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 

       socket_bind($mysock,$address, $port) or die('Could not bind to address');  
       socket_listen($mysock, 5); 

 

Nå er det en stund siden jeg lekte med sockets i php, men tror det skulle holde socketen åpen en god stund.. husk også å legge til en liten sleep i while loopen så du ikke spiser opp hele cpuen.

EDIT: Husker ikke om den står og henger på read om der ikke er noe å lese, så mulig du slipper den sleepen inni loopen, er for sent til å lese det nå og regner med at du finner det ut ganske kjapt.

 

Den første usleep(250000) saken er ikke særlig nyttig der den står nå da den bare utsetter opprettelsen av socketen en liten stund.

 

Og merk at etter at du har kommet inn i while loopen for å hente data fra socket er det ingen vei ut foreløpig, så der har du noe å sysle med i morgen:)

Endret av Slettet+1298342134
Lenke til kommentar

Da er jeg kommet til dette..

Har ikke fått testet enda, men satser på å få gjort det rett over helgen.

 


// don't timeout
set_time_limit (0);
// set some variables
$host = "xx.xxx.xx.xxx";
$port = "xxxx";

// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");

// bind socket to port
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");

// start listening for connections
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");
echo "Waiting for connections...\n";

// accept incoming connections
// spawn another socket to handle communication
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
echo "Received connection request\n";

// keep looping and looking for client input
do
{
// read client input
$input = socket_read($spawn, 1024, 1) or die("Could not read input\n");
if (trim($input) != "")
{
echo "Mottatt input: " . $input;
echo "\n\n";
// if client requests session end
if (trim($input) == "END")
{
// close the child socket
// break out of loop
socket_close($spawn);
break;
}
// otherwise...
else
{
// reverse client input and send back
// KeepAlive
if (preg_match("<KeepAlive>", $input)) {
	$output='<?xml version="1.0" encoding="UTF-8"?><IHM><KeepAliveResponse/></IHM>';
	// write data back to socket server
	socket_write($spawn,$output,strlen($output));
	echo "Sendt KeepAlive: " . $output;
	echo "\n\n";
	}else{
	//$output='Data mottatt...';
	$output=$input;
	// write data back to socket server
	socket_write($spawn,$output,strlen($output)) or die("Could not write output\n");
	echo "Sendt output: " . trim($output);
	echo "\n\n";
}

}
}
} while (true);
// close primary socket
socket_close($socket);
echo "Socket terminated\n";

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...