/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
HTTP header
Fra : Ukendt


Dato : 25-05-04 21:25

Hej NG

Jeg er ved at lave en linux server, der skal kunne tilgås fra en browser
(ie) - derfor skal jeg have serveren til at sende en http-header med en html
streng til browseren. Jeg har fået etableet forbindelsen via socket, og
sender min header afsted, med "Halli Hallo" i body'en af HTML strengen - men
i browseren kommer der ikke til stå Hali Hallo, men derimod noget i rtening
af "Halli HalloHTTP/1.0 200
OK\r\nContent-Length:255\r\nContent-Type:text/html\r\nConnection:
Keep-Alive" - er der nogen der kan finde fejlen???

void* serveClient( void* socket )
{
char buffer[256],b[255];
for(;;) {
sprintf(b,"HTTP/1.0 200
OK\r\nContent-Length:255\r\nContent-Type:text/html\r\nConnection:
Keep-Alive\r\n\r\n<HTML><HEAD><TITLE>Webserver</TITLE></HEAD><BODY>Halli
Hallo</BODY></HTML>" +'\0');
int i = strlen(b)+1;
bzero(b,255);
sprintf(buffer,"HTTP/1.0 200
OK\r\nContent-Length:%d\r\nContent-Type:text/html\r\nConnection:
Keep-Alive\r\n\r\n<HTML><HEAD><TITLE>Webserver</TITLE></HEAD><BODY>Halli
Hallo</BODY></HTML>" +'\0',i);
write( (int)socket, buffer, strlen(buffer)+1 );
bzero(buffer,255);
if (read( (int)socket, buffer, 255) > 0 )
{
if ( buffer[0] == 'X' ) {
close( (int)socket );
pthread_exit( NULL );
}
}
}
}



 
 
Peter Jensen (28-05-2004)
Kommentar
Fra : Peter Jensen


Dato : 28-05-04 10:50

skovge wrote:

> Jeg er ved at lave en linux server, der skal kunne tilgås fra en
> browser (ie) - derfor skal jeg have serveren til at sende en
> http-header med en html streng til browseren.

Jeg ville nok have startet med en noget mere overskuelig 'text/plain'
streng, men det er lige meget.

> Jeg har fået etableet forbindelsen via socket, og sender min header
> afsted, med "Halli Hallo" i body'en af HTML strengen - men i browseren
> kommer der ikke til stå Hali Hallo, men derimod noget i rtening af
> "Halli HalloHTTP/1.0 200
> OK\r\nContent-Length:255\r\nContent-Type:text/html\r\nConnection:
> Keep-Alive" - er der nogen der kan finde fejlen???

Nu har jeg ikke lige en IE her, så jeg ved ikke helt hvordan den
håndterer en Content-Length der er forkert. Hvad viser den som
kildekode til den side du henter?

(Jeg rydder lige koden lidt op, så jeg har en chance for at læse den)

> void* serveClient( void* socket )
> {
> char buffer[256],b[255];

Fast størrelse buffere til noget der kommunikerer over Internettet?
Mener du selv at det er en god ide?

> for(;;)
> {
> sprintf(b,"HTTP/1.0 200
> OK\r\nContent-Length:255\r\nContent-Type:text/html\r\nConnection: \
> Keep-Alive\r\n\r\n<HTML><HEAD><TITLE>Webserver</TITLE></HEAD><BODY>Halli\
> Hallo</BODY></HTML>" +'\0');

Hvad er meningen med at sætte Content-Length til 255? Det er den jo
ikke. Og hvad i alverden laver '\0' dér?

> int i = strlen(b)+1;

Hvad prøver du at regne ud hér? Forhåbentligt ikke din Content-Length.

> bzero(b,255);

Hvorfor lavede du en streng, bare for at slette den igen (og så endda
med en deprecated funktion)? Hvilket formål tjener den linje egentligt?
Og hvilket formål tjener 'b'?

> sprintf(buffer,"HTTP/1.0 200
> OK\r\nContent-Length:%d\r\nContent-Type:text/html\r\nConnection: \
> Keep-Alive\r\n\r\n<HTML><HEAD><TITLE>Webserver</TITLE></HEAD><BODY>Halli\
> Hallo</BODY></HTML>" +'\0',i);

Og hvad er det så for en Content-Length vi får her? Prøv lige at læse
ordet igen. *Content*-Length, ikke Content+Header-Length. Jeg tror det
er her det for alvor går galt. Her er et eksempel på brugen af den
header fra min Apache server:

$ HEAD pekaje.homeip.net
200 OK
Connection: close
Date: Fri, 28 May 2004 09:25:40 GMT
Accept-Ranges: bytes
ETag: "3cc0af-5b0-88c2280"
Server: Apache/2.0.49 (Gentoo/Linux) PHP/4.3.6
Vary: negotiate,accept-language,accept-charset
Content-Language: en
Content-Length: 1456
Content-Location: index.html.en
Content-Type: text/html; charset=ISO-8859-1
Last-Modified: Sun, 02 May 2004 15:50:18 GMT
Client-Date: Fri, 28 May 2004 09:25:40 GMT
Client-Peer: 80.197.144.4:80
Client-Response-Num: 1
TCN: choice

$ GET pekaje.homeip.net|wc -c
1456

> write( (int)socket, buffer, strlen(buffer)+1 );

Du er i en pthread her, ikke? Lad mig gætte, du typecastede din file
descriptor som en pointer for at kunne sende den til tråden, hvorefter
du typecaster den tilbage, korrekt? Det virker nok, men jeg har en idé
om at det nok ikke er smart at antage at en pointer variabel har plads
til en int i sig. Det er måske bedre at sende en pointer til int i
stedet for.

Noget andet er at jeg ikke er sikker på at du behøver skrive null
termineringen ud sammen med resten, og hvad vil du gøre hvis ikke hele
bufferen blev skrevet ud?

> bzero(buffer,255);

Brug memset.

> if (read( (int)socket, buffer, 255) > 0 )
> {
> if ( buffer[0] == 'X' )

Jeg er ikke lige 100% sikker på hvad du prøver på hér, men dit største
problem ligger som sagt tidligere.

> {
> close( (int)socket );
> pthread_exit( NULL );
> }
> }
> }
> }


--
PeKaJe

Whenever people agree with me I always feel I must be wrong.
      -- Oscar Wilde

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409076
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste