Forum: PC-Programmierung PHP Probleme


von Patti (Gast)


Lesenswert?

Hallo Leute,
ich möchte folgende Webseite http://85.178.122.5/ auslesen und in eine 
Textdatei schreiben. Das Problem ist, der Server ist hinter dem Router 
(Fritzbox) und fopen funzt hier nicht :-( .

Mit fsockopen('http://85.178.122.5/';, 80, $errno, $error, 5); bekomme 
ich auch ein false.

Wie würdet Ihr das lösen? Ich komme mehr aus dem C Bereich und bin in 
der Netzwerkgeschichte noch recht frisch.
Bin für alles mehr als dankbar.

Wünsche noch einen schönen Sonntag.

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

spontan würd ich auf safe-mode von php tippen...


spuckt der irgendwas in $error bzw $errno aus???

73

von Christian R. (mrrotzi)


Lesenswert?

Moment, von wo aus möchtest du das überhaupt machen?
Ich kann die Seite mit einem normalen Browser garnicht öffnen!
-> Timeout!
Also könnte ich zB auch gar kein Script schreiben, das das tut!
Versuchst du das daheim in einem privaten Netz? Wie kommst du dann zu 
der IP Adresse?

von Patti (Gast)


Lesenswert?

Hi Leute,
danke erst einmal für eure Zeit.
Ich habe ein Webserver in meinem Netzwerk der mir die Temperatur zb auf 
einer HTML Seite liefert. Über Port Forwarding kann ich jederzeit über 
wetterstation.mine.nu mir meine Daten anzeigen lassen (außer ich mache 
den Router aus oder Dyn funktioniert mal wieder nicht richtig)
Nun zu meinem Problem:

Ich hatte mir folgendes überlegt zum testen und fgets schreibt nichts in 
die Datei.

$datei = "test.txt";
$filestream = fsockopen("http://wetterstation.mine.nu/";, 80, $errno, 
$error);
if(!filestream){
echo "Fehler: $errno";
echo "Fehlerbeschreibung: $error";
}
else echo "IP geöffnet!";
$filestream = fopen("http://wetterstation.mine.nu/","r";);
if(!$filestream) echo "Fehler beim öffnen!<br>";
else echo "Webseite geöffnet!<br>";

while(!feof($filestream)) {
      $resultat = fgets($filestream);
      $a = fopen($datei,"a");
      fwrite($a,$resultat);
}
fclose($a);
fclose($filestream);

$groesse = filesize("$datei");
if($groesse==0) echo "Es wurde nix in $datei gespeichert!";
else echo "Es wurden $groesse Bytes in $datei gespeichert!";

Da ich Neuling in PHP bin habe ich dan recherchiert und es liegt wohl am 
Router und man muss wohl so sich "als Browser" ausgeben

fp = fsockopen("http://wetterstation.mine.nu/";, 80, &$errno, &$errstr, 
30);
  if ($fp)
   {
       fputs($fp, "GET ".wetterstation.mine.nu." HTTP/1.0\n\n");
       while (!feof($fp))
       {
          $reply = fgets($fp);
      }
    fclose($fp);
    }
    echo $reply;

Aber warum steht nichts in reply drin??????? Habe ich bei der 
Browseranfrage Fehler gemacht? Habe auch von socket_set_blocking gelesen 
hat das was damit zu tun?

Vielen Dank!

von Hans (Gast)


Lesenswert?

du must dem server schon sagen, dass du die daten haben willst.. sonst 
bekommst auch nix.. daher das GET.. aber der passt irgendqwie nicht 
ganz...

"GET ".wetterstation.mine.nu." HTTP/1.0\n\n"
sollte doch
"GET / HTTP/1.0\n\n"

sein oder seh ich da was falsch??

naja auf jedenfall gibts da doch eine funktion die dir das direkt machen 
kann...

http_get

schau doch einfach mal unter den http-functions auf php.net nach...

http://at.php.net/manual/de/ref.http.php


73

von Peter Gerlmann (Gast)


Lesenswert?

Hallo,

fsockopen() ist eine Funktion auf ziemlich tiefer Ebene - Die kann sowas 
wie http:// nicht interpretieren. Du musst den Hostname oder die 
IP-Adresse direkt übergeben, zum Beispiel so:
fsockopen("mikrocontroller.net", ...);
Wohin sie sich in deiner Version verbindet, weiß ich nicht.

Gruß,

Folke

von Patti (Gast)


Lesenswert?

Hi Leute,
danke erst einmal für Eure Zeit und Euer Verständnis.
Aber vielleicht habe ich mich unklar ausgedrückt und möchte mein Problem 
nochmal präzise ausdrücken:

Ich habe einen Mikrocontroller (MSP430) und einen Lancontroller (der mir 
eine HTML Seite generiert (ich habe ihm vorher meine C Daten 
übergeben)).
Beide sind auf einem Entwicklungsboard 
(http://www.olimex.com/dev/msp-easyweb3.html) verbaut.
Das Board verfügt über einen TCP Stack und ist über eine IP ansprechbar.
Wenn ich nun im LAN diese IP über meinen Browser aufrufe erscheint die 
Webseite.
Nun habe ich in meiner FritzBox das Portforwarding oder Portfreigabe 
aktiviert, damit meine ich alle Anfragen von außen auf mein aktuelle IP 
bzw. auf wetterstation.mine.nu (habe ich mir dyndns.org eingerichtet) 
werden über Port80 an Port80 weitergeleitet und an die Interne IP 
192.168.xx.xx von meinem Board gesendet und man kann sich die HTML Seite 
anschauen.

Nun möchte ich die Daten von dieser Seite auslesen und auf einem 
Richtigen Server meiner UNI speichern. Das auslesen (parsen) einer HTML 
Seite ist so kein Problem gewesen (zb eine Testseite auf dem Server der 
UNI usw.) Leider funktioniert die Variante hier nicht (mit fopen)

Nun zu meinem aktuellen Problem:

Ich hatte mir folgendes überlegt zum testen aber fgets schreibt nichts 
in
die Datei.

$datei = "test.txt";
$filestream = fsockopen("http://wetterstation.mine.nu/";, 80, $errno,
$error);
if(!filestream){
echo "Fehler: $errno";
echo "Fehlerbeschreibung: $error";
}
else echo "IP geöffnet!";
$filestream = fopen("http://wetterstation.mine.nu/","r";);
if(!$filestream) echo "Fehler beim öffnen!<br>";
else echo "Webseite geöffnet!<br>";

while(!feof($filestream)) {
$resultat = fgets($filestream);
$a = fopen($datei,"a");
fwrite($a,$resultat);
}
fclose($a);
fclose($filestream);

$groesse = filesize("$datei");
if($groesse==0) echo "Es wurde nix in $datei gespeichert!";
else echo "Es wurden $groesse Bytes in $datei gespeichert!";

Da ich Neuling in PHP bin habe ich dan recherchiert und es liegt wohl am
Router und man muss wohl so sich "als Browser" ausgeben

fp = fsockopen("wetterstation.mine.nu", 80, &$errno, &$errstr,
30);
if ($fp)
{
fputs($fp, "GET ".wetterstation.mine.nu." HTTP/1.0\n\n");
while (!feof($fp))
{
$reply = fgets($fp);
}
fclose($fp);
}
echo $reply;

Aber warum steht nichts in $reply drin, das ist doch unlogisch, oder?
Wo liegt den das Problem? Wie würde ein Profi die Geschichte lösen? 
Wichtig ist auch ich kann mit dem Board nichts senden oder als Datei 
speichern, nur ein HTML Seite generieren und muss diese auslesen.

Also Danke noch mal an alle die mir helfen wollen.

Vielen Dank!

von Tom (Gast)


Lesenswert?

Muss es denn unbedingt C sein?

Mit C# wären es 3 Codezeilen :)

von Tom (Gast)


Lesenswert?

ähm .. net C ... :) PHP natürlich :)

von Feadi (Gast)


Lesenswert?

Aber in PHP sind es doch auch nur 3 Zeilen.
1
print http_get( "www.mikrocontroller.net" );
oder
1
print http_get( "http://wetterstation.mine.nu/" );
Das wars schon.

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

das hat nix mit deinem router zu tun!!!

tuts per normalen browser? wenn ja ists nicht der router!

> Da ich Neuling in PHP bin habe ich dan recherchiert und es liegt wohl am
> Router und man muss wohl so sich "als Browser" ausgeben
>
> fp = fsockopen("wetterstation.mine.nu", 80, &$errno, &$errstr,
> 30);
> if ($fp)
> {
> fputs($fp, "GET ".wetterstation.mine.nu." HTTP/1.0\n\n");


der GET kann so nicht passen! mach wie oben beschrieben einen http_get 
das tut genau das was du willst!

73

von Patti (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
leider hat bishetzt noch nichts den gewünschten Erfolg gehabt, ich habe 
jetzt unter http://85.178.80.78/ einfach eine HTML Seite die ich 
generiere. Ich habe alle Spielereien weggelassen und gebe reinen Text 
aus.

Die CURL Extension hatte da auch nicht mehr Erfolg :-( (wurde mir unter 
http://selfphp.de/forum/showthread.php?t=15782&page=3 empfohlen)

Wer hat noch ein Idee? Warum sollte ich eine Seite nicht parsen können 
wenn ich Sie aber öffnen kann?

Hier der aktuelle PHP Code und er öffnet auch die IP!

<?php

unlink("test.txt");
$datei = "test.txt";

$filestream = fsockopen("http://wetterstation.mine.nu/";, 80, $errno, 
$error);
if(!filestream){
echo "Fehler: $errno";
echo "Fehlerbeschreibung: $error";
}
else echo "IP geöffnet!";

fputs($filestream, "GET / HTTP/1.0\r\n\r\n");

while(!feof($filestream)) {
   echo fgets($filestream);
/*     $resultat = fgets($filestream);
     $a = fopen($datei,"a");
     fwrite($a,$resultat); */
}

//fclose($a);
fclose($filestream);

?>

Vielen Dank an Euch für Eure Hilfe.

PS: Falls die IP nicht mehr erreichbar ist hat sich mein Board 
(EaysyWeb3) aufgehangen.

von Feadi (Gast)


Lesenswert?

Änder diese Zeile:
1
$filestream = fsockopen("http://wetterstation.mine.nu/", 80, $errno,


in das hier:
1
$filestream = fsockopen("wetterstation.mine.nu", 80, $errno, $error);

dann gehts.

von Feadi (Gast)


Lesenswert?

C:\Dokumente und Einstellungen\Feadi\Desktop>c:\php5\php.exe huhu.php
IP ge÷ffnet!<html>
<head>
<title>Daten Wetterstation</title>
</head>
<body>
Versorgungsspannung in Volt * 100:
<br>Chiptemperatur in Grad * 10:
</body>
</html>


Das hier ist die Ausgabe bei mir.

von Patti (Gast)


Lesenswert?

Sorry das hatte ich schon geändert, bin nur in der Datei verrutscht :-( 
.
Aber es geht bei mir immer noch nicht. Wenn es bei Dir geht, denn kann 
doch nur der Server auf dem das Script liegt, schuld sein!
Ich komme nur die Ausgabe  "IP geöffnet!".

Dabb nuss ich mich mal an den Admin wenden.
Danke an alle die mir geholfen haben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.