|
| Sokker til Linux via HTTP.2 Hvordan sende~ Fra : Jimmy |
Dato : 16-01-02 01:20 |
|
Til et skoleprojekt er jeg ved at skrive en lille søgemaskine server.
Jeg forsøger at hardcode index.html men ved ikke hvad der skal til for at
klient browseren (f.eks. IE eller Navigator) opdager EOF.
F.eks. Navigator melder "stalled", der kommer ikke "Done" i status linien.
Nogle forslag?
char *start = "HTTP/1.0 200 OK Content-Type: text/html \n\n";
char *index = "<html><head><title>Gruppe1 - Søgemaskine</title><meta
content=\"\"><style></style></head><body>Velkommen til vores internet
søgemaskine<br><form method=\"get\" action=\"\">Indtast venligst søgeord og
tryk søg<br><br><input type=\"text\" name=\"emneord\" size=255><input
type=submit value=\" - SØG - \"></form></body></html>";
send(new_socket,start,strlen(start),0);
send(new_socket,index,strlen(index),0);
Selve socken ser således ud:
socket_desc=socket(AF_INET,SOCK_STREAM,0);
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(our_port);
if (bind(socket_desc, (struct sockaddr *)&address, sizeof(address)))
while(1)
{
listen(socket_desc,5)
addrlen = sizeof(struct sockaddr_in);
new_socket = accept(socket_desc, (struct sockaddr *)&address,
(socklen_t *) &addrlen))
};
| |
Christian Hemmingsen (16-01-2002)
| Kommentar Fra : Christian Hemmingsen |
Dato : 16-01-02 01:55 |
|
"Jimmy" <longgaard@hotmail.com> writes:
> Til et skoleprojekt er jeg ved at skrive en lille søgemaskine server.
> Jeg forsøger at hardcode index.html men ved ikke hvad der skal til for at
> klient browseren (f.eks. IE eller Navigator) opdager EOF.
> F.eks. Navigator melder "stalled", der kommer ikke "Done" i status linien.
>
> Nogle forslag?
>
> char *start = "HTTP/1.0 200 OK Content-Type: text/html \n\n";
Her har du jo allerede tabt. RFC2616 siger at man skal bruge
det der populært bliver kaldt "network linebreaks", dvs. CR LF, henholdsvis
ASCII 13 og 10.
Så når du skal lave en ny linje i dine Headers, så skal du sige "\r\n".
Desuden synes jeg ikke jeg kan se at du lukker forbindelsen når du har
sendt dit svar, så det er ikke så underligt at dine browsere ikke
detecter EOF...
--
Christian Hemmingsen
| |
Martin Dyring (16-01-2002)
| Kommentar Fra : Martin Dyring |
Dato : 16-01-02 08:30 |
|
"Christian Hemmingsen" <postmaster@hemmingsen.nospam.kampsax.k-net.dk> wrote
in message news:m2ofjvi08k.fsf@kewl.kampsax.dtu.dk...
> "Jimmy" <longgaard@hotmail.com> writes:
[snip]
> Desuden synes jeg ikke jeg kan se at du lukker forbindelsen når du har
> sendt dit svar, så det er ikke så underligt at dine browsere ikke
> detecter EOF...
Der udover mangler der linjeskift efter HTTP status koden. Dvs. det skal
ende med at se sådan her ud:
char *start = "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n";
Samtidigt skal man bemærke at send() ikke nødvendigvis sender hele bufferen
men returnerer det antal bytes der er "sendt". Altså skal man lave noget i
stil med:
unsigned size = strlen(data);
for(unsigned sent = 0; sent < size; )
{
unsigned result = send(socket, data + sent, size - sent);
if(result == 0)
{
// Ikke godt.. Forbindelsen smidt?
}
else
sent += result;
}
Og overstående er (hvis nogen skulle være i tvivl :) utestet.
--
Mvh,
Martin Dyring
| |
Benny Andersen (17-01-2002)
| Kommentar Fra : Benny Andersen |
Dato : 17-01-02 01:17 |
|
Hej Jimmy
I tillæg til de andre gode råd, vil jeg nævne response headerne: Content-Length og Connection
Content-Length, giver sig selv og der skal være overensstemmelse mellem
Connection: close
og serverens nedlukning af TCP forbindelse, eller
Connection: keep-alive
og serverens opretholdelse af samme.
Men det er meget let at lure af hvis du finder en webclient som viser responce headere, og anvender denne overfor en 'rigtig' webserver. Du
kan f.eks anvende wget (open source), eller hvis du har java sdk installeret, webclient fra http://www.coreservlets.com.
By the way: socket kan (dog ikke netværk kommunikationsmæssigt) oversættes til bøsning, det har intet med sokker at gøre. (Eller er der
noget jeg ikke har forstået?)
---
Benny Andersen
Som dog ikke lige ved hvad en client under linux forventer af HTTP.2
| |
Byrial Jensen (17-01-2002)
| Kommentar Fra : Byrial Jensen |
Dato : 17-01-02 20:01 |
|
Benny Andersen <be99@worldonline.dk> skrev:
> Hej Jimmy
>
> I tillæg til de andre gode råd, vil jeg nævne response headerne:
> Content-Length og Connection
Disse headere hører til HTTP/1.1. Der var vist tale om HTTP/1.0
i den kode som så vi.
| |
Benny Andersen (17-01-2002)
| Kommentar Fra : Benny Andersen |
Dato : 17-01-02 21:47 |
|
On Thu, 17 Jan 2002 19:00:54 GMT, Byrial Jensen <bjensen@nospam.dk> wrote:
>Benny Andersen <be99@worldonline.dk> skrev:
>> Hej Jimmy
>>
>> I tillæg til de andre gode råd, vil jeg nævne response headerne:
>> Content-Length og Connection
>
>Disse headere hører til HTTP/1.1. Der var vist tale om HTTP/1.0
>i den kode som så vi.
OK, det var jeg faktisk ikke klar over, og ja, RFC1945 (HTTP/1.0) nævner, så vidt jeg kan se, kun Content-Length som mulig en request
header.
| |
|
|