PHP Server Sendet Werbung



  • Hallo,
    Ich greife auf einen PHP Server zu um dort
    Daten abzurufen.
    Das Programm speichert die Antwort in einem Array und wertet sie danach aus:
    Manchmal stürzt mein Programm leider übelst ab.
    Nach stundenlangem Debuggen hab ich den Grund herrausgefunden:
    Der PHP Server sendet statt einer vernünftigen Antwort vorher
    erstmal einen Werbe-Layer:

    HTTP/1.1 200 OK
    Date: Fri, 19 Jan 2007 11:01:09 GMT
    Server: Apache/1.3.34 (Debian) PHP/5.2.0-8
    X-Powered-By: PHP/5.2.0-8
    Set-Cookie: PHPSESSID=ddbd1c08b995f7b8e72e366a2a5774c5; path=/
    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
    Connection: close
    Content-Type: text/html; charset=UTF-8
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/
    DTD/xhtml11.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
      <title>Tools - Banlist.nl</title>
      <link href="/styles/gradients.css" title="Gradients (Sidebar layout; default)"
     type="text/css" rel="stylesheet" media="screen" />
      <link href="/styles/print.css" type="text/css" rel="stylesheet" media="print"
    />
    </head>
    <body>
      <div id="contentjumper">
        <a accesskey="j" href="#main" title="Jump to content">Jump to content</a>
      </div>
      <div id="title">
        <h1><span>Banlist.nl</span></h1>
        <div id="bannerad">
          <script type="text/javascript" src="/include/advert.php?type=banner&amp;sc
    riptonly=yes"></script>
          <script type="text/javascript" src="http://pagead2.googlesyndication.com/p
    agead/show_ads.js"></script>
        </div>
      </div>
      <div id="sidebar">
        <div id="adblock">
          <h2>Advertisements</h2>
          <div id="buttonad">
            <script type="text/javascript" src="/include/advert.php?type=block&amp;s
    criptonly=yes"></script>
    

    Was kann ich da denn jetzt machen?
    Ich empfange das so:

    amountRecieved = recv( mySocket, cMsg, 500000, 0 );
    

    Danke schonmal für eure Tatenkräftige Hilfe



  • Frag dich, warum dein Programm mit dem Werbebanner nicht klar kommt. Ich würde es so machen, dass ich die Daten erst nach dem Empfang auswerte und nicht schon während des Empfangs. Dann kann ankommen was will und die Fehlerbehandlung kannst du dann in die spätere Auswertung verlagern.



  • Luckie schrieb:

    Frag dich, warum dein Programm mit dem Werbebanner nicht klar kommt. Ich würde es so machen, dass ich die Daten erst nach dem Empfang auswerte und nicht schon während des Empfangs. Dann kann ankommen was will und die Fehlerbehandlung kannst du dann in die spätere Auswertung verlagern.

    Ich werte ja nach dem Empfang aus:

    lOk = ( send( mySock, cMsg, strlen( cMsg ), 0 ) >= 0 );
    		   if ( lOk )
    		   {
    			   ZeroMemory(cMsg, 500000);
                   amountRecieved = recv( mySock, cMsg, 500000, 0 );
    		   }
    		   closesocket( mySock );
    		}
    
           // Close Winsock
           WSACleanup();
    //Hier kommt iergendwo meine Auswertung, alles ist schon Empfangen
       }
    


  • Hat zwar wahrscheinlich nichts mit dem Problem zu tun, aber einmal recv aufrufen ist einfach falsch. Da kann auch nur ein 1 Byte kommen.



  • recv schrieb:

    Hat zwar wahrscheinlich nichts mit dem Problem zu tun, aber einmal recv aufrufen ist einfach falsch. Da kann auch nur ein 1 Byte kommen.

    Und was is dann bitte richtig -.-



  • Im Ernstfall: So lange immer stückchenweise recv() aufrufen, bis der meldet, daß keine Daten mehr kommen.

    int recv_all(int sock,void* buf,int max_len)
    {
      char* cbuf=buf;
      int datalen=0;
      int blocklen;
      while((datalen<max_len)&&((blocklen=recv(sock,cbuf+datalen,max_len-datalen,0))!=0))
        datalen+=blocklen;
      return datalen;
    


  • #define MAX 500000
    
    char cMsg[MAX]; // dein request da rein ?
    bool 10k = false;
    unsigned amountReceivedTotal = 0;
    unsigned amountReceived = TRUE;
    
    lOk = (send( mySock, cMsg, strlen( cMsg ), 0 ) >= 0 );
    if(10k) {
    while(amountReceived && amountReceivedTotal += (amountReceived = recv( mySock, cMsg + amountReceivedTotal, MAX - amountReceivedTotal, 0 ));
    }
    cMsg[amountReceivedTotal] = 0; // serverantwort nun drinnen
    
    closesocket( mySock );
    

    war wohl wer schneller 😉



  • DaRpH schrieb:

    #define MAX 500000
    
    char cMsg[MAX]; // dein request da rein ?
    bool 10k = false;
    unsigned amountReceivedTotal = 0;
    unsigned amountReceived = TRUE;
    
    lOk = (send( mySock, cMsg, strlen( cMsg ), 0 ) >= 0 );
    if(10k) {
    while(amountReceived && amountReceivedTotal += (amountReceived = recv( mySock, cMsg + amountReceivedTotal, MAX - amountReceivedTotal, 0 ));
    }
    cMsg[amountReceivedTotal] = 0; // serverantwort nun drinnen
    
    closesocket( mySock );
    

    war wohl wer schneller 😉

    Dein Code ist Gold wert!

    Unendlicher Dank von mir 😃

    An dem Problem hab ich so lange gearbeitet und endlich geht es
    nun, mir hast du den Tag gerettet ^^,
    das gleiche gilt natürlich auch für CStoll


Anmelden zum Antworten