Hi an Alle!
Wie im Topic zu lesen soll dieses Programm einen kleinen Webserver darstellen, der zunächst einmal nur die Seite bei einem Request in den Socket zurückschreiben soll.
Leider scheint hier irgendwo ein Fehler zu sein, da ich, wenn ich die Seite 127.0.0.1 aufrufe, eine Fehlermeldung im Browser bekomme.
Ich stehe nur etwas auf dem Schlauch, da die Kontrollausgaben im Programm so aussehen, wie ich sie mir vorgestellt habe.
Wisst ihr vielleicht weiter?
Desweiteren bin ich mir nicht ganz sicher, ob die Anweisung close(sock); (*in Zeile 185) hier an der richtigen Stelle steht, da dort der socket ja eignetlich immer offen gehalten werden sollte?!
Wo kann ich sie sonst unterbringen? Das Programm wird auf einem SuSe-System ausgefürt und mit Strg+C terminiert. Ich habe die Vermutung, dass hier eventuell der Fehler steckt, da nach einiger Zeit der Aufruf zunächst funktioniert (Seite wird an Client zurückgegeben) und anschließend für eine längere Zeit nicht mehr.
Gruß
huebstAr
Wie im Topic zu lesen soll dieses Programm einen kleinen Webserver darstellen, der zunächst einmal nur die Seite bei einem Request in den Socket zurückschreiben soll.
Leider scheint hier irgendwo ein Fehler zu sein, da ich, wenn ich die Seite 127.0.0.1 aufrufe, eine Fehlermeldung im Browser bekomme.
Ich stehe nur etwas auf dem Schlauch, da die Kontrollausgaben im Programm so aussehen, wie ich sie mir vorgestellt habe.
Wisst ihr vielleicht weiter?
Code:
//
// Programm: einfacher Webserver
// Funktiosumfang: Lauschen auf Port 80, bei Anfrage einer Seite,
// diese zum anfragenden Client zurücksenden
//----------------------------------------------------------------------------
// Einbinden der Headerdateien
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
// Prototypen der verwendeten Funktionen
int deploy_server();
void process_request(int result_accept);
int main()
{
int sock=-1,
source=0,
result_accept=0,
pid=-1,
len_addr=0,
status=0;
struct sockaddr_in requestor;
printf(".\n");
printf(".\n");
printf("Webserver v1.0 gestartet\n");
printf(".\n");
printf(".\n");
do {
sock = deploy_server();
if(sock<0)
{
printf("Fehler beim Deployen des Servers!\n");
printf("<RETURN> für Neuversuch\n\n");
getchar();
}
}while(sock < 0);
while(1)
{
len_addr = sizeof(source);
result_accept = accept(sock, (struct sockaddr*) &source, &len_addr);
if(-1 == result_accept)
{
printf("Fehler beim Verbindungsaufbau\n");
}
else
{
printf("Verbindungsaufbau erfolgreich\n");
}
pid = fork();
if(-1 == pid)
{
printf("Fehler beim erstellen des Sohnprozesses!\n");
}
if(0 == pid)
{
process_request(result_accept);
exit(0);
waitpid(-1, &status, WNOHANG);
printf("Status: %d", status);
}
close(result_accept);
}
}
int deploy_server()
{
int sock,
result_bind=5;
struct sockaddr_in adressinfo;
sock = socket(AF_INET, SOCK_STREAM, 0);
bzero(&adressinfo, sizeof(adressinfo));
adressinfo.sin_family = AF_INET;
adressinfo.sin_port = htons(80);
adressinfo.sin_addr.s_addr = INADDR_ANY;
result_bind = bind(sock, (struct sockaddr*) &adressinfo, sizeof(adressinfo));
if(result_bind == -1)
{
printf("Fehler bei Bind");
return -1;
}
listen(sock, 2);
return(sock);
}
void process_request(int sock)
{
char sendbuffer[8096],
request[8096],
filename[8096],
buffer;
int i=0,
k=0,f=0,
ext_laenge=0,
anzahl=0,
file_descript=0;
char get_ext[4];
bzero(&request, sizeof(request));
bzero(&filename, sizeof(filename));
while(i < sizeof(request)-1) // solange die Länge des Strings nicht überschritten wird
{
if( read(sock, &buffer, 1) > 0 // Solange ein Zeichen gelesen werden kann
&& buffer != '\n' // UND kein Zeilenumbruch
&& buffer != '\r')
{
request[i] = buffer; // weiter einlesen
i++;
}
else
{
request[i] = '\0'; // Sonst String abschließen
break; // und Schleife abbrechen
}
}
// Kontrollausgabe der Anfrage
for(k=0; k< sizeof(request); k++)
printf("%c", request[k]);
printf("\n\n");
// Prüfen ob Get-Anfrage (nicht Case-Sensitive)
if(!strncmp(request, "GET ", 4) || !strncmp(request, "get ", 4)) // falls GET
{
i=5; // Startwert des Index, GET wird ignoriert
if(!strncmp(&request[5], " ", 1)) // Wenn keine Seite angegeben
{
strcpy(request, "GET /index.html"); // String auf index.html setzen
}
while(strncmp(&request[i], " ", 1) != 0) // SOLANGE KEIN Leerzeichen gefunden
{
strncpy(&filename[f], &request[i], 1); // Zeichen an Filename anhängen
f++; i++;
}
// Extensions prüfen
// FEHLT NOCH
// FEHLT NOCH
// FEHLT NOCH
// FEHLT NOCH
printf("OPENING: >%s<\n", filename);
file_descript=open(filename, O_RDONLY); // Angefordertes File öffnen
if(file_descript != -1)
{
/* while(anzahl=read(file_descript, sendbuffer, sizeof(sendbuffer)))
write(sock, sendbuffer, anzahl);*/
write(sock, sendbuffer, read(file_descript, sendbuffer, sizeof(sendbuffer)));
close(file_descript);
}
else
printf("Fehler! File konnte nicht geöffnet werden!\n");
close(sock);
printf("--> ENDE \n");
}
else
printf("Nur GET-Anfragen werden bearbeitet!\n");
}
Desweiteren bin ich mir nicht ganz sicher, ob die Anweisung close(sock); (*in Zeile 185) hier an der richtigen Stelle steht, da dort der socket ja eignetlich immer offen gehalten werden sollte?!
Wo kann ich sie sonst unterbringen? Das Programm wird auf einem SuSe-System ausgefürt und mit Strg+C terminiert. Ich habe die Vermutung, dass hier eventuell der Fehler steckt, da nach einiger Zeit der Aufruf zunächst funktioniert (Seite wird an Client zurückgegeben) und anschließend für eine längere Zeit nicht mehr.
Gruß
huebstAr