Erste Feldversuche mit Sockets und HTTP



  • Hallo,

    char b1[99001];
    	int socket = client (80, "www.diealtengermanen.com");
    	send (socket, "GET /news/index.php HTTP/1.1\r\nHost: www.diealtengermanen.com\r\n\r\n", strlen("GET /news/index.php HTTP/1.1\r\nHost: www.diealtengermanen.com\r\n\r\n"), 0);
    	recv (socket, b1, 99000, 0);
    	cout << b1 << endl;
    

    Socketmäßig funktioniert alles im Hintergrund, die Ausgabe lautet:

    HTTP/1.1 200 OK
    Date: Wed, 29 Apr 2009 08:19:44 GMT
    Server: Apache/2.0.54 (Debian GNU/Linux)
    X-Powered-By: PHP/4.4.2-Debian-0.1~sarge1
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Set-Cookie: PHPSESSID=732a62d1f1ee4b9f7e3e12b91fbdd0fb; path=/
    Set-Cookie: PHPSESSID=2520b8183ff95a17b4aecc7a3e60ca6e; path=/
    Set-Cookie: PHPSESSID=987ba9d27d156712f71b0e93fd33d4e0; path=/
    Set-Cookie: PHPSESSID=6433c76261c35bd1d63ac91d5169d4e6; path=/
    Transfer-Encoding: chunked
    Content-Type: text/html

    11de9

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <script type="text/javascript">
    <!--
    function MM_swapImgRestore() { //v3.0
    var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
    }
    function MM_preloadImages() { //v3.0
    var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
    }

    function MM_findObj(n, d) { //v4.01
    var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
    if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d

    Nun ist egal wie groß ich den Buffer b1 mache, die Ausgabe geht nie weiter als oben angezeigt. Die Seite würde html mäßig noch viel länger sein, aber er liest eigentlich immer nur bis x=d und bricht dann ab.

    Wenn ich nc host 80 > output
    GET /... HTTP/1.1
    Host: blablal

    mache, dann bekomme ich den kompletten html quelltext angezeigt.

    1. Warum geht das mit meinem Source nicht?
    2. Wo ist der Fehler?
    3. wie korrigiere ich den am Besten?

    Danke für die Hilfen und Anregungen
    greetz bako



  • 1.) Weil recv weniger lesen kann, als Du verlangst.
    2.) Du überprüfst den Rückgabewert von recv nicht.
    3.) Überprüfe den Rückgabewert von recv, und solange der > 0 ist (-1 bedeutet Fehler, 0 bedeutet "kommt nix mehr), wende recv erneut an.



  • Ausserdem:

    • Warum definierst Du einen Puffer von 99001 Bytes, sagst dem recv aber, es stehen nur 99000 Bytes zur Verfügung?
    • Die Daten sind nicht null-Terminiert, daher funktioniert Deine Ausgabe auf cout so nicht korrekt. "std::cout.write(puffer, länge)" funktioniert besser. Wobei die Länge, wie schon von LordJaxom angedeutet ist, von recv geliefert wird.



Anmelden zum Antworten