21. marts 2005 - 22:23Der er
16 kommentarer og 1 løsning
Lytte på UDP port
Nogle der ved hvordan man henter data som bliver sendt til min PC via udp, jeg har forsøgt med dette men der sker ikke noget. Via en sniffer kan jeg se af pakkerne vælter ind i ren tekst.
Husk at stream_socket_xxx kun virker under PHP5. Hvis du kører med tidligere versioner af PHP skal du bruge "gammeldaws" sockets. Desuden skal serverdelen ikke køres som et script under webserveren, men i stedet køres i command-line interfacet. Ellers vil serverdelen blive lukket ned efter 30 sekunder (eller hvad du nu har sat script timeout til).
Jeg går ud fra at du kører Windows. Så åbner du en kommandoprompt ved at trykke start->kør... her skriver du cmd.exe og trykker OK. Skift hen til den mappe dit script ligger i, f.eks. "cd c:\web\php" (uden gåseøjne). Hvis scriptet ligger på et andet drev skal du skifte til det drev. Hvis det ligger på D: skriver du "d:".
For at køre scriptet skriver du "<sti til php>\php.exe <scriptnavn>". F.eks. "C:\php\php.exe udpserver.php".
Jeg har prøvet serverscriptet fra php.net og det kører fint på PHP5. Jeg brugte eksemplet fra stream_socket_client til at connecte til serveren. Klienten kan bruges via webserveren.
Nu er det lykkes mig af få kontakt til porten via dette script, men det viser IKKE hvad der bliver sendt til porten..
<?php // example of "daemon" in UDP while(TRUE) { // never stop the daemon $socketD = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); // create an UDP socket
echo 'Creating socket... '; // YES, the socket is creating EACH TIME the while loops
echo "OK\nBinding the socket on 0.0.0.0:27500 ... "; // let the daemon listen on the port 27500 on all interfaces if(!socket_bind($socketD, "0.0.0.0", 27500)) { socket_close($socketD); echo 'socket_bind failed: '.socket_strerror(socket_last_error())."\n"; exit(1); }
echo "OK\nNow ready to accept connections.\nListening on the socket ... \n"; // so far, our socket is open and bound to a port: it's listening for ONE incoming connection
// this is a special way of socket_read()'ing what's on the socket once someone establishes a connection socket_recvfrom($socketD, $buf, 65535, 0, $clientIP, $clientPort); if($buf === FALSE) { // something went wrong echo 'socket_read() returned false : '.socket_strerror(socket_last_error())."\n"; continue; } elseif(strlen($buf) === 0) { // this should mean "client closed the connection" echo 'socket_read() returned an empty string : '.socket_strerror(socket_last_error())."\n"; continue; }
echo 'Incoming connection from '.$clientIP.':'.$clientPort.' ... ';
// ok now thats the tricky part // if you want to reply to the client on the UDP socket it opened, you need to connect your listening socket on them // this won't work unless the client puts their IP in the IP header of the packets it's sending to your socket // UDP sessions don't require them to do so, and if they don't, you have no way to tell who's talking to you on the socket, and therefore no way to reply // so if you want to interact with the client, you have to connect your socket on them, but by doing so, you're no longer listening to other incoming connections // one way to fixe that would be to fork the script when an incoming connection arrives and then stop the forked script once the client exits if(!socket_connect($socketD, $clientIP, $clientPort)) { echo 'socket_create failed to connect the clientsock on '.$clientIP.':'.$clientPort.' : '.socket_strerror(socket_last_error())."\n"; socket_close($socketD); continue; } echo 'connected'."\n"; // cool, now we can reply to the client
// now you can interact with the client using socket_write() and socket_read()
// once you're finished, you need to socket_close() your sockets and let the while loop and re-create the listenning socket (because you're no longer listenning for new incoming connections) } // end of the infinite while ?>
Jeg faldt lige over dit spm i ASP kategorien, så nu har jeg en idé om hvad du skal bruge det til. Jeg går ikke ud fra at din CS server skal have svar, så dette script nøjes med at logge den trafik der kommer til en fil.
<?php $ip = '0.0.0.0'; // Lytter på alle maskinens IPer $port = 27500; $filename = "log.txt";
$fp = @fopen($filename, 'a'); if(!$fp) die('failed to open log file!');
Det er bare helt kanon.... Hvis jeg kører det via command-line interfacet så gør den det den skal, men er der en mulighed for af få vist det "live" i browseren, sådan så hvis siden opdater hver 5 sec så tømmer den bufferen og viser det på siden ??
Du er nødt til at køre serveren separat da den er nødt til at lytte efter UDP pakker hele tiden. Men du kan jo lave et webinterface som læser logfilen og refresher hvert 5. sekund.
Man kan ikke andet end at blive vild med PHP når man først kommer igang. Jeg har selv programmeret ASP tidligere, men skiftede til PHP da jeg fandt ud af hvor flexibelt det var. Der er jo stort set ikke den ting der ikke kan laves out-of-the-box i modsætning til ASP hvor man er nødt til at installere nye COM-objekter på serveren hver gang man skal lave andet end en if-sætning.
ja.. Det er jo lige det der er problemet med ASP, men syntes det er svært af kommer igang med PHP.. Det er en anden verden :) og endnu engang tak for hjælpen
Det var så lidt, og husk lige at lukke spørgsmålet :o)
Det er altid svært at skifte sprog, men øvelse gør jo som bekendt mester. Du kan som regel finde gode eksempler på de fleste funktioner i PHP manualen, så det hjælper jo lidt. Samtidig er manualen opdelt efter funktion (f.eks. MySQL funktioner, sockets osv.) så det er nemt at finde de ting man skal bruge.
jeg vil gøre et forsøg, da jeg kan se en kæmpe fordel
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.