socket_read probleem

Status
Niet open voor verdere reacties.

burner202

Gebruiker
Lid geworden
28 sep 2007
Berichten
70
Beste allemaal, ik ben bezig met twee scriptjes waarvan de ene een zin doorkrijgt van het andere script via socket_write en de andere socket functies.

Nu heb ik de volgende code gemaakt maar er zit een fout in die ik er niet uit kan halen.
PHP:
<?php

echo "Server\n";

set_time_limit(0);
$socketanswer = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_bind($socketanswer,'127.0.0.1',16765);
socket_listen($socketanswer);
socket_set_nonblock($socketanswer);
while(true)
{
	while(($conn = @socket_accept($socketanswer)) !== false)
	{
echo "Waiting for responses...\n";
while (true)
{
$response = '';
while ($buf = socket_read($conn,1))
{
	echo "Reading message...\n";
	$response .= $buf;
}
if ($response == 'quit')
{
	socket_close($conn);
}
if (!$response == '')
{
	echo "Message received...\n";
}
echo strlen($response);
echo $response . "\n";
unset($response);
echo "Loop done...\n";
}
}
}



?>

In deze lus word elke keer gekeken of er een nieuw bericht is en zo ja, dan leest hij hem van de socket en door een echo krijg ik hem te zien.

Alleen er word om een mysterieuze reden niks neergezet.
PHP:
while ($buf = socket_read($conn,1))
Als ik in deze lus echo $response zet, krijg ik netjes mijn bericht, maar als ik dat later doe, buiten de lus dan gebeurt er niks??
ook komt er nooit loop done te staan?

er word ook gekeken of $response inhoud heeft, maar er komt altijd false uit.

Weet iemand waardoor dit probleem ontstaat?
 
Je voegt de hele tijd dingen toe aan $response, maar je checkt wel of hij de value 'quit' heeft, tenzij dat de eerste is zal er nooit 'quit' in komen en zal de loop dus nooit eindigen.

Je zult of een andere variabele moeten hebben; of moeten checken tegen de buffer zelf, of de laatste paar tekens van de string moeten lezen (maar das niet zo'n handige want dan stopt ie ook als je zin eindigd met Quit)
 
Je voegt de hele tijd dingen toe aan $response, maar je checkt wel of hij de value 'quit' heeft, tenzij dat de eerste is zal er nooit 'quit' in komen en zal de loop dus nooit eindigen.

zou je dat iets duidelijker uit kunnen leggen? ik snap niet helemaal wat je bedoelt
 
Ok. Je opent je programma en je begint:
$respons = '';

Je ontvangt je eerste bericht, en dat voeg je toe aan $respons; laten we aannemen dat het 'hoi' is:
$respons .= $buf;
$respons = 'hoi';

Je ontvangt nu een tweede bericht, laten we aannemen dat het tweede bericht 'quit' is om de verbinding te sluiten.
$respons .= $buf;
$respons = 'hoiquit';

Zoals je ziet zal hij dit niet registreren en wat je ook stuurt vanaf dan, wordt aan het eind geplakt maar hij zal nooit uitkomen op $respons = 'quit' tenzij dat het eerste is wat je stuurt.
 
Maar als ik deze regel even apart neem:
PHP:
while ($buf = socket_read($conn,1))

dan stopt die lus toch een keertje? en als hij stopt:

PHP:
if ($response == 'quit')
{
    socket_close($conn);
}
if (!$response == '')
{
    echo "Message received...\n";
}
echo strlen($response);
echo $response . "\n";
unset($response); // << nadruk op deze

hierin word $response leeggemaakt.
maar ik heb het idee dat ik iets over het hoofd zie, is het toevallig zo dat de while lus met socket_read erin altijd true teruggeeft?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan