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/html11de9
<!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=dNun 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: blablalmache, dann bekomme ich den kompletten html quelltext angezeigt.
- Warum geht das mit meinem Source nicht?
- Wo ist der Fehler?
- 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.
-