webForumDet fria alternativet

fgets - vb & php

7 svar · 203 visningar · startad av davids

davidsMedlem sedan mars 2001238 inlägg
#1

Hejsan!

Sitter och experimenterar med Visual Basic och PHP... Har gjort en liten server i VB som helt enkelt tar emot en sträng och skickar tillbaka ett svar. Det jobbiga är att jag måste ange svarets längd i PHP, jag måste alltså veta hur många tecken jag kommer få tillbaka. Annars "hänger sig" sidan...

Min fråga är: Hur gör jag om jag inte vet hur många tecken jag ska få tillbaka?

<?
$server=fsockopen("xxx.xxx.xx.xx","xx",&$errno,&$errstr,30);

if($server != true) {
print "Kunde inte ansluta till servern";
exit;
}

$kommando = "evil php was here";
fputs($server, $kommando);

$resultat = fgets($server, 1);

fclose($server);

print $resultat;
?>
SPiNMedlem sedan mars 20007 896 inlägg
#2

Du kör en loop bara:

...
$serverResult = "";
while( !feof( $server ) )
     $serverResult .= fgets( $server, 128 );
...

Istället för:

$result = fgets( $server, 1 );

Alltså. :)

davidsMedlem sedan mars 2001238 inlägg
#3

Gjorde en liten upptäckt... Verkar som jag inte behöver loopa...
Om man stänger servern när PHP-sidan står och "tuggar" så får den resultatet, men inte annars... Hmmm... Verkar alltså inte spela någon roll om jag använder din loop eller ej... Vad kan man göra åt det?

RED: Vill bara förtydliga... Den tuggar alltså fortfarande även om jag använder mig av loopen...

SPiNMedlem sedan mars 20007 896 inlägg
#4

Skicka med ett par avslutningsgjuck till klienten, som stänger ner då detta upptäcks.

T.ex.

$serverResult = "";
$noteof = true;
while( $noteof ) {
     $noteof = ( !feof( $server ) );
     $tmpStr = fgets( $server, 8 );

     if( $tmpStr == "/[[END]]" || ( !$noteof ) ) {
          $noteof = false;
     }
     else {
          $serverResult .= $tmpStr;
     }
}

När servern har skickat den information som den skulle skicka, skickar du med ytterligare 8 tecken i form av /[[END]], så att klienten vet att överföringen är slut.

davidsMedlem sedan mars 2001238 inlägg
#5

Det fungerade inte... Rent teoretiskt sett måste väl meddelandet vara max 8 tecken (16, 24 osv) för att detta ska funka eftersom den läser 8 i taget... Annars borde den väl inte få in hela "end-kommandot-texten" i samma variabel?

Men jag ändrade så att den läser tecken för tecken tills den upptäcker ett visst tecken( i detta fallet |). Så nu verkar det funka...

Tack för hjälpen på vägen!

/D

SPiNMedlem sedan mars 20007 896 inlägg
#6

Det fungerade inte... Rent teoretiskt sett måste väl meddelandet vara max 8 tecken (16, 24 osv) för att detta ska funka eftersom den läser 8 i taget... Annars borde den väl inte få in hela "end-kommandot-texten" i samma variabel?

Precis. På vilket sätt fungerade det inte? Tuggade sidan ändå? Var ditt meddelande verkligen /[[END]] ( Det är ju åtta tecken )?

davidsMedlem sedan mars 2001238 inlägg
#7

Eftersom den läser 8 tecken i taget så borde det ju inte fungera om serverns svar inte är jämt, exempelvis 8,16, 24 tecken osv... Det fungerade om jag gav ett svar på åtta tecken, men kortade jag ner det till sju så tuggade den. Alltså sidan laddas då aldrig färdig, utan IE-ikonen bara snurrar å snurrar...

Mitt meddelande var exakt det ja... Har testat att skicka det både tillsammans med den andra texten och också separat. Men jag löste det genom att bara använda mig av ett tecken...

SPiNMedlem sedan mars 20007 896 inlägg
#8

Ah! :r
Det tänkte ju inte dumma jag på, såklart... Du har helt rätt, och nu förstår jag varför det inte fungerade. :)

137 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)