Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Alles ab "\r\n\r\n" aus Socket.

  1. #1
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201

    Alles ab "\r\n\r\n" aus Socket.

    Hi,
    ich benutze hier recv() um sachen aus nen socket zu bekommen. Ich will aber den HTTP-HEader nicht.kann mir vielleicht jemand sagen, wie ich meine funktion so unschreibe, dass es nur den HTTP-Body returned? Funktion:
    Code:
    std::string sockget(std::string host, unsigned short int port, std::string cmd) {
      int sock;
      struct sockaddr_in addr;
      char rcvd[65000];
      sock = socket(AF_INET, SOCK_STREAM, 0);
      bcopy(gethostbyname(host.c_str())->h_addr, &addr.sin_addr, gethostbyname(host.c_str())->h_length);
      
      addr.sin_family = AF_INET;
      addr.sin_port = htons(port);
    
      
    if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
        std::cout << "KAPUTT." << std::endl;
        exit(1);
      } else {
        write(sock, cmd.c_str(), cmd.size());
        int as = recv(sock,rcvd,sizeof(rcvd),0);
        rcvd[as] = '\0';
      }
      close(sock);
      std::string toReturn = std::string(rcvd);
      return toReturn;
    }
    P.S.: std::cout << toReturn.find("\r\n\r\n") << std::endl; gibt übrigens 18446744073709551615 aus.
    Geändert von Giuly (20-09-2005 um 14:54 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    20.07.2005
    Beiträge
    8
    Zitat Zitat von Giuly
    P.S.: std::cout << toReturn.find("\r\n\r\n") << std::endl; gibt übrigens 18446744073709551615 aus.
    Ich tippe darauf dass diese zahl std::string::npos ist, das heißt "\r\n\r\n" wurde nicht gefunden.

    Ansonsten musste mal ins RFC gucken, vielleicht kann man irgendwie nur den Body anfordern. Wenn nicht einfach solange "wegschmeißen" bis <body> kommt, ab da an alles in nen string oso schreiben, bis </body> kommt.

  3. #3
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Mich wundert es etwas, dass immer wieder dieser Fehler gemacht wird, das beim "socket"-Aufruf AF_INET angegeben wird.

  4. #4
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201
    was soll ich da denn sonst angeben?

  5. #5
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Laut man socket PF_INET

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  6. #6
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Ja, das meinte ich natürlich. Mich hat es gewundert warum ich das so häufig sehe, obwohl quasi alle Doku die ich dazu kenne (socket-Manpage, Glibc Texinfo-Manual, ein Buch, ... wohl noch mehr) die PF_* Werte nennen, aber nicht AF_*. Jetzt habe ich aus Neugier mal gegoogelt. In dem berühmten Buch von Richard Stevens, welches ich nicht gelesen habe, wird wohl auch AF_* verwendet. Damit muss ich die Benutzung von AF_* wohl als "offiziell" sanktioniert anerkennen :-)
    Aber es kommt noch besser: Ich habe auch mal bei www.opengroup.org im POSIX-Standard gelesen. Anscheinend erwähnt POSIX PF_INET nicht einmal mehr, jedenfalls habe *ich* es nicht gefunden. Nach weiterem Googeln bin ich nunmehr der Meinung, dass AF_INET und PF_INET gleichermaßen korrekt sind. Hier mal ein paar Links dazu:
    http://www.microsoft.com/technet/int.../sfuposix.mspx
    http://www.kohala.com/start/lanciani.96apr10.txt.

    Andererseits betrifft mich persönlich das Problem nur indirekt, da ich sowieso lieber Wrapper verwende (mal abgesehen davon, dass ich eh nicht viel mache, was Netzwerke betrifft).

    Auf jedenfall möchte meine Aussage zurücknehmen, dass AF_INET falsch wäre, dafür sehe ich nun keine gesicherte Grundlage mehr.

    Wenn jemand noch etwas *definitives* dazu weiss, nur heraus damit...

  7. #7
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201
    Kann man sich den String irgendwie mit "\r\n" ausgeben lassen, statt nem newline?

    Edit: Ich hab da jetzt einfach nen Trenn-String eingebaut, weil das bei dem einen Server \r ist, und bei dem andernem - normal - \r\n\r\n
    Geändert von Giuly (20-09-2005 um 21:02 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •