Socket && http



  • Beim Aufbau einer Socket-Verbindung schickt der Client erstmal ne Anfrage raus : Wer heißt hier www.irgendwas.de???
    Irgendein Router oder evtl. auch der Server selbst sagen dann: Ich kenn ihn! und gibt die IP-Adresse, bzw. MAC weiter. Anschließend wird eine Verbindung aufgebaut. Dann machst du dein GET und sagst wieder "Uuund tschüss"

    Die Antwort für das Geschwindigkeitsproblem hast du dir schon selbst gegeben.

    Aaaber wozu brauchst du das?

    Nächstes Problem: Die Zeichen die da nicht sein sollten sind keine Fehlübertragungen - dafür sorgt schon das TCP/IP-Protokoll..
    Schonmal überlegt, dass im Buffer immer Müll steht, wenn er allokiert wird?
    Die Daten sind auch keine Strings, ergo hast du keinen Stringterminator..
    Du solltest also vor dem, Empfangen den Buffer mit '\0' überschreiben (siehe memset())

    Was willst du eigentlich für Daten runterladen?



  • TGGC schrieb:

    Im Hintergrund unbemerkt was runterladen? Keine Fehlermeldungen? Baut hier'n Skriptkiddie 'nen Virus?

    Bye, TGGC (Pipe my World.)

    solche unqualifizierten Äußerungen kannst du dir sparen.

    der sinn ist einfach. in einer anderen programmiersprache hab ich einen chat programmiert. dieser arbeitet mit einer mysql datenbank. und über php lese/schreibe ich die beiträge in die db. aber bei jede verbindungsaufbau stockt der chat kurz, was natürlich nicht schön ist, wenn man z.b gerade was schreibt. also habe ich mir zu erst eine dll programmiert für diesen zweck, leider hab ich es auch nicht geschaft das während die dll die daten runterlies dass das programm weiterläuft. deshalb habe ich vor eine extra! programm zu programmieren was getrennt läuft, so dass man im chat ohne ruckler schreiben kann. (ich weiß ein chat mit mysql und php is langsam, aber es bietet auch viele vorteile.. die jetzt aber nichts zur sache tun.

    und an TGGC, wenn du mal den code gelesen hättest wüsstest du das das programm schon funktioniert - im hintergrund. also brauche ich dafür keine hilfe klar! es geht mir nur um die geschwindigkeit.
    und die fehlermeldungen sind nicht da, da ich das noch ausführlich abhandeln muss, da das andere programm diese ja ausgeben soll.

    DocJunioR, klar hast recht, aber diese zeichen tretten nur 3-4 mal auf????
    meist immer wenn eine leerzeile ist..? vielleicht wird das zeichen dafür falsch interpretiert.



  • 1. probier doch mal WriteFile()
    2. die dateilänge bekommst du vom server mitgeteilt: "Content-Length:"
    3. das header ist nach dem ersten "\r\n\r\n" zu ende
    das sollte dir eigentlich reichen 🙂



  • danke, auf Content-Length hätte ich ja selber kommen können 😉

    das löst jedoch mein hauptproblem noch nicht, wiso die verbindung so lange dauert und warum der pc davon so beansprucht wird?? ich meine, das programm macht doch auch nichts anders als ein Browser der einen get-request schickt, oder?? und da geht es ja auch schnell und überhaupt net cpu beanspruchend.

    ---
    es werden immer mehr fragen.. 😕



  • mach mal deinen puffer grösser, dann kriegste auch mehr bytes auf einmal 😉

    //edit: außerdem wozu diese:
    #include <windows.h>
    #include <string>
    #include <ctime>
    ??



  • #include <windows.h>
    #include <string>
    #include <ctime>
    is ja nur ein stück vom code, hab ja nur das wichtigste gepostet, nur das womit ich mein problem habe.

    den puffer größer zu machen bringt nix, jedenfalls mit dem code so wie ich ihn habe, ob ich jeweils nur eins oder gleich einige hundert oder mehr bringt keinen geschwindigkeitszuwachs. außerdem könnte ich ja damit leben das es nicht blitz schnell geht, aber es muss cpu schonender ablaufen. das hält doch keiner aus, wenn alle 2 sek. der pc ruckelt...



  • ich bin hier schon richtig? oder gehört das in den c++ bereich?

    also wenn es nicht geht, muss ich halt mit meiner alten version vorlieb nehmen.. dachte halt mann könnte das besser machen?



  • [quote="DocJunioR"]
    Schonmal überlegt, dass im Buffer immer Müll steht, wenn er allokiert wird?
    Die Daten sind auch keine Strings, ergo hast du keinen Stringterminator..
    Du solltest also vor dem, Empfangen den Buffer mit '\0' überschreiben quote]

    mache ich das nicht mit: recv_buf[rc]='\0'; denn nicht?

    wenn ich mir von der php das ausgeben lassen will:

    <?php 
    echo "start\n";
    echo "Hallo\n";
    echo "ende\n";
    ?>
    

    müsste ja

    start
    Hallo 
    ende
    

    dabei rauskommen.

    es kommt aber:

    6

    start

    6

    Hallo

    5

    ende

    2

    0

    raus.

    //aber wie gesagt das is das kleinere problem



  • Noir schrieb:

    außerdem wie finde ich am besten heraus wann der http header zu Ende ist?

    nach dem ersten auftreten von cr-lf-cr-lf

    Noir schrieb:

    ich habe auch bemerkt das man wenn man bis zum dateiende liest, verzögert es mehr als wenn man eine bestimmte anzahl ausliest, das problem ist das ich ja die größe im voraus nicht weiß 😕

    man braucht i.d.r. die grösse nicht vorher zu wissen. wenn der server die verbindung schliesst hat er alles gesendet



  • schon klar. aber test mal. lass dir mal schnell in einem konsolen fenster den inhalt einer website ausgeben. der text rattert durch, aber am schluss, nachdem schon alles da ist, braucht es noch ca. 2-4 sek. bis die verbindung zu ende ist.

    ps. in den meisten anderen socket beispielen finde ich immer:
    #include <winsock2.h>
    ich verwende #include <winsock.h> denn ansonsten kommen bei mir immer hunderte fehlermeldungen... is mein compiler veraltet?
    also ich habe vc6 im include ordner gibts beide varianten..



  • und wenn ich z.b in einer schleife 100mal hintereinander auslesen will.. hängt es sich auf..kommt keine fehlermeldung... aber beendet nicht mehr



  • ok... mein letzter versuch hier... bekomm ja sowiso keine antwort 😮

    #include <windows.h>
    #include <stdlib.h> 
    #include <stdio.h>
    #include <iostream>
    #include <winsock.h>
    #include <ctime>
    
    using namespace std;
    
    int main(){
    
    char* host;
    char  send_buf[256];
    char  recv_buf[256];
    long  rc;
      SOCKET s;
      SOCKADDR_IN addr;
      WSADATA wsa;
      HOSTENT* hent;
    
    WSAStartup(MAKEWORD(2,0),&wsa);
    addr.sin_family=AF_INET;
    addr.sin_port=htons(80);
    host = "serverirgendwas.de";
    
      if((addr.sin_addr.s_addr=inet_addr(host))==INADDR_NONE)
      {
    	  hent=gethostbyname(host);
    	  strncpy((char*)&addr.sin_addr.s_addr,hent->h_addr,4);
      }
    int zahl=0;
    int zeit;
    int zeit1;
    zeit1 = time(NULL);
    for (int repeat=0;repeat < 100; repeat++)
    {
    zeit = time(NULL);
    
    s=socket(AF_INET,SOCK_STREAM,0);
    connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
    sprintf(send_buf,"GET //irgendwas.php HTTP/1.1\nHost: Hubsi.biz\n\n");
    
    send(s,send_buf,strlen(send_buf),0);
    
    while((rc=recv(s,recv_buf,1,0))>0)
     {
    recv_buf[rc]='\0';
    cout << recv_buf;	
    }
    
    cout << "Zeit: " << time(NULL)-zeit << " Sekunden." << endl;
    closesocket(s); //verbindung kappen
    
    }
    cout << "Gesamtzeit: " << time(NULL)-zeit1 << " Sekunden." << endl;
    Sleep(5000);
    	return 0;
    
    }
    

    also jetzt mal als konsolenanwendungsbeispiel: das gibt jetzt 100 mal den inhalt einer php datei aus. bei mir geht das sehr schnell, aber zwischen jedem neuen verbindungsaufbau vergehen ca. 3 sek. wenn ich aber nicht bis zum ende lese geht das 1000mal schneller.
    wie erreiche ich das jetzt wenn ich nicht weiß wieviel daten ich bekomme wann es zu ende ist? damit ich kurz zuvor mit dem lesen aufhören kann.
    (Content-Length gibt mein server gar nicht zurück...)
    hab hier mal irgendwo was wie FIONREAD aufgeschnappt.. konnte aber nix gescheites dazu finden...

    //so dauert es lange:
    while((rc=recv(s,recv_buf,1,0))>0)
    {
    recv_buf[rc]='\0';
    cout << recv_buf;
    }

    ;wenn ich die anzahl der bytes kenne geht es viel schneller:
    for (zahl=0;zahl < 2000;zahl++)
    {
    rc=recv(s,recv_buf,1,0);
    recv_buf[rc]='\0';
    cout << recv_buf;
    }

    ---
    und was ist jetzt mit winsock.h und winsoch2.h ??


Anmelden zum Antworten