[PHP]Socket server wacht op read.forceer disconnect client

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
Ik ben bezig met een socket server.
Ik heb alles bijna voor elkaar maar loop tegen een probleem aan.

Wat ik wil is: De client verbind met de server en luisterd 25 seconden en daarna wordt de client gedisconnect.

Het probleem is de socket_read functie wacht totdat hij wat gelezen heeft.
Dus als ik 2 clients heb dan heb ik 2 read functies. (Ik maak voor iedere connectie een nieuwe instance aan van een class die de afhandeling doet per connectie). Als dan de 1e read functie wacht op lezen dan staat de 2e connectie 'niks' te doen. Mijn 2e probleem is dat de time out die ik mmv een eigen berekening doe.
code:
1
2
3
4
5
$this->timeOUT = mktime(date("H"),date("i"),date("s")+5,date("m"),date("d"),date("Y"));
while( mktime(date("H"),date("i"),date("s"),date("m"),date("d"),date("Y") < $this->timeOUT )
{

}

Omdat de socket_read pas de volgende regel triggert als hij wat gelezen heeft (tot \n of het aantal ingestelde bytes) loopt hij eigenlijk niet. Zolang ik niks schrijf 'verloopt' de time out niet. Dus hij si altijd connected totdat ik iets schrijf.

Mijn 2e connectie wacht ook op de read van de 1e connectie. Dus die timeout verloopt ook niet |:( Mijn Ajaxscript blijft dus maar runnen 8)7
Ik heb dus geprobeert dmv classes alle connecties apart af te handelen ma php niet multi threaded is maakt dat eigenlijk niet uit. (of kan dat met php wel?).

IK kom er niet meer uit :? Ik wil dus eigenlijk dat de socket_read niet blijft wachten maar met een 'time out' stopt met wachten en verder gaat.
Nu zag ik dat er een functie is socket_set_nonblock(). Alleen zie ik bij alle voorbeelden en uitleg dat dit werkt voor de socket_accept. Dan failed hij direct. Maar hoe werkt dat dan bij de read of werkt het daar zowiezo niet bij :?

Omdat de 2e connectie ook wacht blijft mijn ajax script runnen. Ook al doe ik een fclose van de connectie. Ik zou dan ook bij de client een disconnect kunnen forceren na de time out. Dan stopt mijn ajax.php ook.

Kent iemand dit probleem? _/-\o_

Jochemmol


Acties:
  • 0 Henk 'm!

Verwijderd

Hmmm ik weet dat de pcntl extensies van PHP een soortemet van process forking/threading/subprocessing implementeren maar of het goed werkt zou ik niet kunnen weten.

Zou je niet iets kunnen doen met een functie timer die true is zolang er nog geen 25 seconden zijn verstreken sinds de eerste aanroep en zolang dat true is laat je de socket connectie x bytes inlezen, als het false is kap je ermee, reset je je timer en ga je verder?

edit:
Ik zie dat je zoiets doet maar waarom zit je dan te hannessen met mktime? Je kan toch gewoon:
PHP:
1
2
3
4
5
6
7
8
9
$timeout = 15;
$expire = time() + $timeout;

while( $expire > time() )
{

  # Do strange socket stuff

}

Doen?

Overigens snap ik je probleem niet helemaal maar kun je niet gewoon uit de voeten als je nonblocking sockets gebruikt?

[ Voor 29% gewijzigd door Verwijderd op 08-07-2008 09:58 ]


Acties:
  • 0 Henk 'm!

  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
dat is mijn probleem.
De read wacht gewoon totdat hij wat vind. Ik kan niet tussen tijds een timer false zetten.
Als dat kan is mijn probleem opgelost.

Jochemmol


Acties:
  • 0 Henk 'm!

Verwijderd

Zie edit :)

En ja, je zoekt voor non-blocking sockets. Zie link voor een goede uitleg daarover.

Een non-blocking socket kapt meteen zodra hij geen data binnenkrijgt. Dus je zal een soortemet van "polling" struktuur moeten opzetten maar dat kun je daar allemaal lezen :)

By the way, als je met meerdere sockets moet praten zou je misschien beter je socket connecties naar een aparte klasse overhevelen en gebruik maken van multiplexing om met meerdere sockets te praten. Als je wat googled dan kun je daar zat over vinden. Misschien is dat te hoog gegrepen (voor deze klus) maar het is leuk en leerzaam en "the way to go".

Over het algemeen is threaden om het threaden niet de moeite waard en zeker niet voor een paar (twee) connecties. Dan kun je beter coroutines/multiplexing etc etc gaan doen!

[ Voor 137% gewijzigd door Verwijderd op 08-07-2008 10:06 ]


Acties:
  • 0 Henk 'm!

  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
Verwijderd schreef op dinsdag 08 juli 2008 @ 09:59:
Zie edit :)

En ja, je zoekt voor non-blocking sockets. Zie link voor een goede uitleg daarover.

Een non-blocking socket kapt meteen zodra hij geen data binnenkrijgt. Dus je zal een soortemet van "polling" struktuur moeten opzetten maar dat kun je daar allemaal lezen :)

By the way, als je met meerdere sockets moet praten zou je misschien beter je socket connecties naar een aparte klasse overhevelen en gebruik maken van multiplexing om met meerdere sockets te praten. Als je wat googled dan kun je daar zat over vinden. Misschien is dat te hoog gegrepen (voor deze klus) maar het is leuk en leerzaam en "the way to go".

Over het algemeen is threaden om het threaden niet de moeite waard en zeker niet voor een paar (twee) connecties. Dan kun je beter coroutines/multiplexing etc etc gaan doen!
Bedankt :)
Je heb gelijk (je edit) ik kan die time duidelijk beter opzetten. Op zich werkt dit ook goed maar is een beetje onduidelijk/onhandig gedaan :9 Jou manier is inderdaad beter.

Ik denk dat non-blocking mijn oplossing is. Ik ga dat eens proberen en testen. Bedankt voor de handleiding. Ik krijg dan een false terug van mijn socjet_read functie maar kan dan die fout handele en het programma verder laten lopen.

Multiplexen heb ik weinig kaas van gegeten.
Wat ik nu doe is:
Ik heb 2 classes.
1 class met de socket functies (read/write/close) en een class met een array van de instances van de 1e class. Dus ik maak per connectie een class aan. Binnen die class heb ik dan een eigen sokcet connectie.

Als ik de 2e class var_dump heb ik ook 2 objecten in die class zitten. Ik heb dan een for loop die elke keer de classes doorloopt. dat werkt wel oke 'opzich' op een rare manier haalt hij de classes instances wel eens door elkaar. Maar misschien dat dat met non-blocking opgelost is.
Elke class (dmv van var_dump class 2) heeft wel een eigen socket connection resource

Jochemmol