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&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&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