Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

PHP - Socket Problem

Frage Entwicklung PHP

Mitglied: Kallinger

Kallinger (Level 2) - Jetzt verbinden

24.04.2010 um 15:57 Uhr, 4905 Aufrufe, 8 Kommentare

Socket öffen, mit Get abfragen, mit Post senden und wieder abfragen

Hi @ all!

Ich hab mal schon wieder ein doofes PHP Problem...

Und zwar möchte ich einen Socket zu einem Webserver öffnen, dann Daten mittels GET empfangen, und per POST wieder senden und dannach den Request wieder empfangen...
kunrz und knapp: Hier ist der BSP. Code:

01.
 
02.
/* zuvor wird noch einiges gemacht, ist aber hierfür nicht wichtig ... *
03.
/* Funktion um Daten an den Webserver zu schicken *
04.
function PostToHost($host, $path, $referer, $data_to_send) { 
05.
 
06.
$fp = fsockopen($host, 80, $errno, $errstr, 30); 
07.
	 
08.
$out = "GET $path HTTP/1.1\r\n"
09.
$out .= "Host: $host\r\n"
10.
$out .= "Keep-Alive: 115\r\n"
11.
$out .= "Connection: keep-alive\r\n\r\n"
12.
 
13.
	fwrite($fp, $out); 
14.
	$res = ""
15.
	while (!feof($fp)) { 
16.
		$res .= fgets($fp, 128); 
17.
18.
	//echo "RES: ".$res
19.
 
20.
/* Bis hier her gehts noch ... */	 
21.
 
22.
/* Folgende Kontrolle gibt auch keinen Fehler aus... *
23.
	// Überprüfung des Sockets 
24.
	$status = socket_get_status($fp); 
25.
	if ($status['timed_out']) { 
26.
		echo "socket timed out<br />"
27.
28.
 
29.
	// Daten an webserver senden 
30.
	if (isset($res)) {				unset($res);} 
31.
 
32.
/* Daten werden gesendet, es kommt aber kein request zurück! */	 
33.
	fputs($fp, "POST $referer HTTP/1.1\r\n"); 
34.
	fputs($fp, "Host: $host\r\n"); 
35.
	fputs($fp, "Referer: $referer\r\n"); 
36.
	fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); 
37.
	fputs($fp, "Content-length: ". strlen($data_to_send) ."\r\n"); 
38.
	fputs($fp, "Keep-Alive: 115\r\n"); 
39.
	fputs($fp, "Connection: keep-alive\r\n"); 
40.
	fputs($fp, $data_to_send); 
41.
	fputs($fp, "\r\n\r\n"); 
42.
	$res = ""
43.
	while (!feof($fp)) { 
44.
		$res .= fgets($fp, 128); 
45.
46.
	// echo $res
47.
	 
48.
/* Folgende Kontrolle gibt auch keinen Fehler aus... *
49.
	// Überprüfung des Sockets 
50.
	$status = socket_get_status($fp); 
51.
	if ($status['timed_out']) { 
52.
		echo "socket timed out<br />"
53.
54.
 
55.
/* Wäre nicht nötig, es bringt aber auch nix.. !? es wird das gleiche ausgegeb wie beim 1. GET*/	 
56.
	// 2. Get 
57.
	$out = "GET $path HTTP/1.1\r\n"
58.
	$out .= "Host: $host\r\n"
59.
	$out .= "Connection: close\r\n\r\n"
60.
 
61.
	fwrite($fp, $out); 
62.
	$res = ""
63.
	while (!feof($fp)) { 
64.
		$res .= fgets($fp, 128); 
65.
66.
	 
67.
	 
68.
	fclose($fp); 
69.
	echo "<br />RES: ".$res
70.
 return $res
71.
72.
 
Also das Script wird ordnungsgemäßs aufgerufen und läuft auch durch!
Aber...:
  • Es wird nicht $res zurückgegeben
  • Der Socket scheint ab dem GET geschlossen zu sein.. zumindest geht ab dann nix mehr
  • Habe per Whireshark das ganze schon überprüft, es werden die Daten per GET empfangen
  • Danach bekomme ich den Request, dann sende ich die Daten per POST
  • Dann sende ich die GET anfrage bekomme aber nix zurück! (eigentlich müsste ich das GET auch nicht mehr senden) sondern müsste gleich in dem $res nach dem POST stehen tuts aber nicht
  • Whireshark läss auch auf keinen Fehler schließen...


Hat jemand vll. nen Tipp !?
Danke schon mal im Voraus

__
Grüße Kallinger

PS: nen neuen Socket kann ich nicht aufmachen, da sonst die SessionID vom Webserver sich wechseln würde. Die ist aber hier nötig!
Mitglied: dog
24.04.2010 um 16:46 Uhr
Und zwar möchte ich einen Socket zu einem Webserver öffnen

Wofür cURL schonmal wesentlich besser ist, als selbst basteln - und es kann auch alles, was du brauchst.

Und mit feof() wirst du auch nicht weit kommen bei HTTP.
Es gibt für HTTP zwei Arten Daten zu senden: Als kompletter Block (dann ist der Content-Length-Header angegeben) oder mit Transfer-Encoding: chunked, dann erhältst du einzelne Blöcke mit Längenangabe (und ein "0" am Schluss).
Bitte warten ..
Mitglied: Kallinger
24.04.2010 um 19:53 Uhr
Hi!

Das Problem liegt ja weder an der Content Length (wird ja eh berechnet) noch am Transfer Encoding...
Ich glaube eher dass das Problem an PHP (bei mir lokal) liegt..

vll. ein Programmierfehler, oder ein falscher Parameter in der php.ini !?
Ich komm einfach nicht drauf!


__
Grüße Kallinger
Bitte warten ..
Mitglied: dog
24.04.2010 um 21:54 Uhr
01.
<?php 
02.
 
03.
	$ch = curl_init(); 
04.
	 
05.
	curl_setopt($ch, CURLOPT_FAILONERROR, true); 
06.
	curl_setopt($ch, CURLOPT_FAILONERROR, true); 
07.
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
08.
	 
09.
	 
10.
	curl_setopt($ch, CURLOPT_URL, "http://www.example.com/"); 
11.
	 
12.
	$res1 = curl_exec($ch); 
13.
	 
14.
	curl_setopt($ch,CURLOPT_POST,true); 
15.
	curl_setopt($ch,CURLOPT_POSTFIELDS,array('key' => 'value','key2' => 'value2')); 
16.
	 
17.
	$res2 = curl_exec($ch); 
18.
 
19.
	curl_close($ch); 
20.
  
21.
 
22.
?>
Bitte warten ..
Mitglied: Kallinger
26.04.2010 um 15:05 Uhr
Hi!

Hab jetzt gerade mal curl ausprobiert ... Muss sagen, dass das Teil echt super ist!
Zum einen viel schneller und zum anderen auch stark vom Handling!

Leider funktioniert das ganze noch nicht ganz so, wie ich das möchte...


Hier ma mein Code:
01.
 
02.
function PostToHost_2($host, $path, $referer, $data_to_send, $username, $mail, $i) { 
03.
 
04.
	$ch = curl_init(); 
05.
	 
06.
	curl_setopt($ch, CURLOPT_FAILONERROR, true); 
07.
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
08.
	curl_setopt($ch, CURLOPT_URL, $referer); 
09.
	 
10.
	$res = curl_exec($ch); 
11.
echo "...........RES........... <br /> $res"
12.
 
13.
// Den Request bekomme ich Tadellos ... 
14.
 
15.
 
16.
	curl_setopt($ch,CURLOPT_POST,true); 
17.
	curl_setopt($ch,CURLOPT_POSTFIELDS, $data_to_send); 
18.
	 
19.
	$res2 = curl_exec($ch); 
20.
echo "...........RES 2......... <br /> $res"
21.
 
22.
// Leider ist der 2. Request genau das gleiche wie der 1. !? 
23.
 
24.
	curl_close($ch); 
25.
 
26.
	return $res2
27.
 
28.
 
29.
// Hier noch mein $data_to_send 
30.
name=Kallinger&username=". $username ."&....
Kann ich das so schreiben oder muss das ein Array sein!?
Laut WhireShark sieht das ganz gut aus !?

Hmmm... wenn Du nochmal ne Idee hättest, wärs supi!

Danke!
__
Grüße Kallinger
Bitte warten ..
Mitglied: dog
26.04.2010 um 15:39 Uhr
01.
$res2 = curl_exec($ch); 
02.
echo "...........RES 2......... <br /> $res"; 
03.
 
04.
// Leider ist der 2. Request genau das gleiche wie der 1. !?
Und jetzt schau dir mal die Variablennamen genau an
Bitte warten ..
Mitglied: Kallinger
26.04.2010 um 16:05 Uhr
Hey!


Js, sorry! hab ich ganz vergessen zu Posten... hab ich geänder!
funktioniert leider immer noch nicht

hab jetzt mal noch ne Frage zu
01.
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
Wann und wie funktioniert das, wen ich auf die LOCATION zugreifen will !?
Muss ich die nochmal extra anfordern oder macht das PH automatisch ...

Weil komischerweise ist das so:
GET ftk. POST auch, aber dann bekomm ich ein HTTP 200 Status zurück uns sollte eig. nen 301 bekommen !? an was kann das liegen !?

__
Grüße Kallinger
Bitte warten ..
Mitglied: dog
26.04.2010 um 16:09 Uhr
01.
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
bedeutet, dass curl einem Location:-Redirect automatisch folgt, so lange bis es ein Ergebnis bekommt (2xx/4xx/5xx-Header).
Bitte warten ..
Mitglied: Kallinger
26.04.2010 um 16:34 Uhr
Hi!

Ah, OK!
Jetzt bekomme ich auch den HTTP 301 zurück...
und in dem Packet steht auch meine LOACTIOn drinne.. greift jetzt

01.
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
automatisch auf den Link zu, oder ?!
Wenn ich dam beim $res2 durchsuche, kann ich mich auch darauf verlassen, dass ich auch den LOCATION link geöffnet habe...
Brauch ich dann für ne Suche in dem $res2 wieder, oder !?


DANKE
__
Grüße Kallinger
Bitte warten ..
Ähnliche Inhalte
Linux
Php redis an Socket binden?
gelöst Frage von FA-jkaLinux2 Kommentare

Hallo, kann ich via php5 auch redis-Server über Socket ansprechen? In den Beispielen, die ich bis jetzt gefunden habe, ...

PHP
Problem mit php
Frage von jensgebkenPHP4 Kommentare

hallo gemeinschaft ein bekannter hat mir ein kleines script geschrieben in diesem code weerden die variaben f eine sql ...

Lizenzierung
Lizenz pro Socket
gelöst Frage von TastuserLizenzierung4 Kommentare

Hallo ! Immer wieder sehe ich bei Software "pro Socket" für einen Host. Kann mir jemand das erklären ?

CPU, RAM, Mainboards
CPU Upgrade Socket 478
Frage von 122573CPU, RAM, Mainboards14 Kommentare

Hallo, der Rechner von meinem Opa fragt nach ner neuen CPU. Momentan ist ein Pentium 4@2,53 Ghz drin. Der ...

Neue Wissensbeiträge
Verschlüsselung & Zertifikate

Die Hölle friert ein weiteres Stück zu: Microsoft integriert OpenSSH in Windows

Information von ticuta1 vor 24 MinutenVerschlüsselung & Zertifikate

Interessant SSH-Kommando in CMD.exe und PowerShell

Apple

IOS 11.2.1 stopft HomeKit-Remote-Lücke

Tipp von BassFishFox vor 1 TagApple

Das Update für iPhone, iPad und Apple TV soll die Fernsteuerung von Smart-Home-Geräten wieder in vollem Umfang ermöglichen. Apple ...

Windows 10

Windows 10 v1709 EN murkst bei den Regionseinstellungen

Tipp von DerWoWusste vor 1 TagWindows 10

Dieser kurze Tipp richtet sich an den kleinen Personenkreis, der Win10 v1709 EN-US frisch installiert und dabei die englische ...

Webbrowser

Kein Ton bei Firefox Quantum über RDP

Tipp von Moddry vor 1 TagWebbrowser

Hallo Kollegen! Hatte das Problem, dass der neue Firefox bei mir auf der Kiste keinen Ton hat, wenn ich ...

Heiß diskutierte Inhalte
Windows Server
RODC kann nicht aus Domäne entfernt werden
Frage von NilsvLehnWindows Server18 Kommentare

HAllo, ich arbeite in einem Universitätsnetzwerk mit 3 Standorten. Die Standorte haben alle ein ESXi Cluster und auf diesen ...

Hardware
Kein Bild mit nur einer bestimmten Grafikkarten - Mainboard Konfiguration
gelöst Frage von bestelittHardware18 Kommentare

Hallo zusammen, ich hatte schon einmal eine ähnliche Frage gestellt. Damals hatte ich genau das gleiche Problem. Allerdings lies ...

Netzwerkmanagement
Mehrere Netzwerkadapter in einem PC zu einem Switch zusammenfügen
Frage von prodriveNetzwerkmanagement17 Kommentare

Hallo zusammen Vorweg, ich konnte schon einige IT-Probleme mit Hilfe dieses Forums lösen. Wirklich klasse hier! Doch für das ...

Hardware
Links klick bei Maus funktioniert nicht
gelöst Frage von Pablu23Hardware16 Kommentare

Hallo erstmal. Ich habe ein Problem mit meiner relativ alten maus jedoch denke ich nicht das es an der ...