[PHP] Socket receive timeout *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een scriptje waarmee je info kunt ophalen van een Soldier of Fortune 2 server, maar ik liep tegen een probleem aan.
SoF2 servers werken met UDP (net als iedere gamesserver), dus moet je dat protocol ook gebruiken om info op te halen. Dit lukt prima met PHP. Enige probleem is dat als de server niet bestaat PHP eeuwig staat te wachten bij de socket_recvfrom() functie.
Weet iemand hoe ik dit op moet lossen?

Als ik het ding op non-blocking (asynchroon) zet krijg ik:
Warning: socket_recvfrom() unable to recvfrom [11]: Resource temporarily unavailable
;(

Heb verder nog hier, op het fok!forum en op google gezocht, maar kon niet echt iets vinden.
Alvast bedankt :)

Acties:
  • 0 Henk 'm!

Verwijderd

Zoek eens op GoT en Google naar een halflife stats tooltje in php, deze zijn er namelijk wel en misschien kun je deze ombouwen

Acties:
  • 0 Henk 'm!

Verwijderd

stream_set_timeout
(PHP 4 >= 4.3.0)

stream_set_timeout -- Set timeout period on a stream
Description
bool stream_set_timeout ( resource stream, int seconds [, int microseconds])

dat al eens geprobeerd?

om te gebruiken: gewoon fsockopen doen of whatever. En dan deze : stream_set_timeout($socket,10);

als voorbeeld. fgets ofzo wacht op \r\n om af te breken. nu heeft ie een time out :*)

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

fsockopen kent zelf al een connectie-timeout-parameter, die kan je imho beter gebruiken.
De functie die hierboven wordt genoemd is voor tijdens de communicatie, maar heeft geen invloed op het openen van de socket zelf.

[ Voor 43% gewijzigd door ACM op 16-11-2003 11:59 ]


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Kun je niet een preventieve ping packet versturen voor je de daadwerkelijke socket opent :?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • igmar
  • Registratie: April 2000
  • Laatst online: 03-09 22:58

igmar

ISO20022

ACM schreef op 16 november 2003 @ 11:58:
fsockopen kent zelf al een connectie-timeout-parameter, die kan je imho beter gebruiken.
De functie die hierboven wordt genoemd is voor tijdens de communicatie, maar heeft geen invloed op het openen van de socket zelf.
Die parameter werkt niet met UDP sockets, zoals ook in de manual staat :


Warning

UDP sockets will sometimes appear to have opened without an error, even if the remote host is unreachable. The error will only become apparent when you read or write data to/from the socket. The reason for this is because UDP is a "connectionless" protocol, which means that the operating system does not try to establish a link for the socket until it actually needs to send or receive data.


hetgeen ook logisch is : UDP is een stateless protocol.

Acties:
  • 0 Henk 'm!

Verwijderd

Misschien heb je hier wat aan: http://www.qstat.org/
Is wel een executable maar die kan je natuurlijk vanuit php uitvoeren en de output echo'en. Programma werkt voor meerdere games, ook wel handig

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mocht iemand hetzelfde probleem hebben en dit topic via de search ofzo tegenkomen:

Heb het inmiddels al 'opgelost' met fsockopen(), op een andere manier lukte me niet.

PHP:
1
2
3
4
5
6
7
8
$socket = fsockopen("udp://{$adres}", $poort, $errNumber, $errDescription, 0);
socket_set_timeout($socket, $timeoutInSeconden);
fwrite($socket, 'ÿÿÿÿgetstatus');
$stat = fread($socket, 10000);
fclose($socket);

if ($stat == '') { echo 'Server niet gevonden'; die(); }
else { echo nl2br(htmlspecialchars($stat)); }
Pagina: 1