Tastatureingabe mit Sockets



  • Hallo allerseits,
    Ich schreibe gerade auf der Windows-Konsole einen kleinen Client für HTTP bei dem jedoch der Paketinhalt selbst eingetippt werden soll.

    Egal welchen Server ich teste, ich bekomme jedesmal die Fehlermeldung 400 Bad Request zurück.

    Wenn ich allerdings den Paketinhalt schon im Prog. im Char-Array definiere, klappt alles wunderbar. Nur mit der Tastatureingabe geht es nicht.

    Ich habe mir auch die Variable wieder ausgeben lassen um zu gucken ob es beim Einlesen einen Fehler gab, aber der Inhalt ist sauber.

    Hier der Kode meines beta-Hiobs Programms:

    #include <windows.h>
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    
    #define BUF_SIZ 4096
    
    using namespace std;
    
    int main()
    {
     char buf[BUF_SIZ], s_paket[1200];
     int s, bytes;
     string ipx;
    
     WSADATA wsa;
     WSAStartup(MAKEWORD(2, 2), &wsa);
    
     while(1)
     {
      bytes = 1;
      cout << " IP: ";
      cin >> ipx;
      cout << "\n Inhalt: ";
      cin.ignore(1, '\n');
      cin.getline(s_paket, sizeof(s_paket));
      cout << '\n';
    
      const char *ipaddrx = ipx.c_str();
      s = socket(PF_INET, SOCK_STREAM, 0);
    
      struct sockaddr_in addr;
    
      addr.sin_addr.s_addr = inet_addr(ipaddrx);
      addr.sin_port = htons(80);
      addr.sin_family = AF_INET;
    
      if(connect(s, (struct sockaddr*) &addr, sizeof(addr)) == -1)
      {
       cout << "\n\n keine Verbindung.\n";
      }
      else
      {
       cout << "\n\n Verbindung hergestellt.\n\n";
    
       send(s, s_paket, strlen(s_paket), 0);
    
       while(bytes != 0)
       {
        bytes = recv(s, buf, sizeof(buf)-1, 0);
    
        buf[bytes] = '\0';
        printf("%s", buf);
        cout << '\n';
       }
      }
      cout << "\n Verbindung vom Server beendet.\n\n";
      closesocket(s);
     }
     return 0;
    }
    


  • Wie bekommst du das \r\n in den Puffer? Und das \0?



  • 400 Bad Request

    kommt normalerweise von IIS-servern.
    Du musst ordentliche header versenden um das zu vermeiden.

    Ausser wenn dein kompletter request schon Quatsch ist. Dann kriegst du natürlich auch Quatsch (400) vom Empfänger zurück.



  • manni66 schrieb:

    Und das \0?

    Det sollte getline erledigen.



  • Ich achte natürlich darauf dass ich korrekte Requests eintippe. Wenn ich einen Req im Char-Array definiere und auf die "Inhalt"-Eingabe verzichte bekomme ich die korrekte Seite vom Server.

    Ich nehme mal an es gibt Probleme mit der Eingabe von \r\n und/oder cin.ignore

    Die Eingabe funktioniert aber, wenn ich s_paket mit Getline eingebe, und mir s_paket mit cout ausgeben lasse, ist der Inhalt richtig.

    Ich versteh nicht welche Zeichenfolge(n) fehlerhaft sein sollen, bzw was das Programm für einen MÜLL raussendet.



  • aloha55 schrieb:

    Die Eingabe funktioniert aber, wenn ich s_paket mit Getline eingebe, und mir s_paket mit cout ausgeben lasse, ist der Inhalt richtig.

    Da steht dann \r\n drin? Das hältst du dann für richtig?



  • Ja die Zeichen werden so mit ausgegeben. Und jetzt wo ich darüber nachdenke müssten die Escape-Sequenzen eigentlich ausgeführt werden statt mit den Bustaben angezeigt.
    Ich weiß aber nichts über den Buffer und brauche hilfe.



  • Du müsstest die Escapesequenzen selber parsen und ersetzen.
    Du könntest die ASCII-Zeichen direkt eingeben (Alt+013 für \r auf dem Ziffernblock). Keine Ahnung, ob das funktioniert.
    Ich würde den Header Zeilenweise in einen std::string einlesen und am Ende jeweils ein "\r\n" anfügen. Die Zeilen würde ich in einem weiteren std:.string zum Header zusammenbauen und dann übertragen.



  • Schreib erstmal alles in eine Datei. Dann kannst du kontrollieren was schief läuft.
    Wahrscheinlich fehlt das abschließende \r\n\r\n oder sowas.

    http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html


Anmelden zum Antworten