Socketprogrammierung in C

Neue Frage »

Auf diesen Beitrag antworten »
deppensido Socketprogrammierung in C

Hallo,

in meiner letzten Übungsaufgabe für dieses Semester soll man einen Webserver programmieren. Den Webserver und den zugehörigen Client habe ich soweit auch hinbekommen, d.h. Kommunikation klappt und der Webserver schickt bei erfolgter Anmeldung eines Clients einen fixen String (in meinem Fall hello world) zurück.

Nun soll man im letzten Teil der Aufgabe den Webserver aber erweitern, so steht da: "Statt eines festen Strings soll nun die im HTTP-Request angeforderte Datei an den Client gesendet werden. Wenn eine angefragte Datei nicht existiert soll der Fehlercode "404" zurückgegeben werden."

Was meinen die mit "im HTTP-Request angeforderte Datei, wo soll die herkommen"? Im Programmgerüst steht als Kommentar, dass man den HTTP-Header auswerten, parsen und dann zum Client schicken soll. Ich vermute mit HTTP-Header sind "irgendwelche" Informationen vom 'Client gemeint, die von diesem verschickt werden sollen und dann vom Webserver ausgewertet und wieder zurück geschickt werden sollen. Könnte mir da jemand auf die Sprünge helfen, ich versteh beim besten Willen nicht, was man nun eigentlich genau machen soll. Im folgenden noch meine Codes für Webserver und Client: Vielen Dank im voraus.

Webserver:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>

#define PORT 8080
#define BUF_SIZE 1024
#define MAX_QUEUE 1

int listenSocket;
char buf[BUF_SIZE];

void startServer()
{
    /* Hier soll ein Socket erstellt und konfiguriert werden, der auf
     * eingehende Anfragen wartet. Die Reihenfolge der benötigten syscalls
     * (bind, listen, socket) und deren Verwendung
     * finden Sie im Anhang der Vorlesungsfolien zum Thema Rechnernetze.
     * Die folgenden Zeilen sind zu erweitern und in die richtige Reihenfolge zu bringen.
     */
    //socket auf Port 8080 oeffen
    struct sockaddr_in my_addr;
    if((listenSocket = socket(AF_INET,SOCK_STREAM,0)) == -1)
        printf("Fehler! Kann Socket nicht erstellen.\n");
    
    memset(&my_addr, '0', sizeof(my_addr));
    memset(buf, '0', sizeof(buf));
    
    my_addr.sin_family = AF_INET;
    //Jeder darf sich mit dem Server verbinden
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    my_addr.sin_port = htons(PORT);
    
    //bind socket
    bind(listenSocket,(struct sockaddr*)&my_addr,sizeof(my_addr));
    //listen
    if(listen(listenSocket, MAX_QUEUE) == -1) {
	printf("Listen fehlgeschlagen\n");
    }
}

void handleConnections()
{
    /* Nachdem ein Socket erstellt wurde, soll in dieser Funktion auf eingehende 
     * Anfragen gewartet werden. Antworten Sie auf die Anfrage mit einem fixen String.
     *
     * Zum Debuggen ist das Tool telnet sehr nützlich.
     */
    //Verbindung akzeptieren und fixen String schicken
    int connection_f;
    while(1) {
	connection_f = accept(listenSocket,0,0);
	strcpy(buf, "Hello World");
	send(connection_f, buf, strlen(buf), 0);
	
	close(connection_f);
    }
     /*
      * Wenn eine einfache Anfrage funktioniert, erweitern Sie das Programm,
      * sodass der HTTP-Header ausgewertet wird. Der HTTP-Header der Anfrage lässt sich mit
      * recv() und strtok() parsen.
      * Öffnen Sie dann die angeforderte Datei und senden Sie sie an den Client. (Vorher muss
      * ein HTTP-Header gesendet werden.)
      */
     while(1) {
	connection_f = accept(listenSocket,0,0);
	recv(connection_f, buf, strlen(buf), 0); 
	//fopen();
	//send();
     }
     
     
     /*
      * Und fertig ist der Webserver! Das war ja einfach! :-)
      */
}

int main()
{
    startServer();
    handleConnections();
    close(listenSocket);
    return 0;
}    


Client:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>

#define PORT 8080
#define BUF_SIZE 1024

int main() {
    int sock, run;
    char buf[BUF_SIZE];
    //socket erstellen
    struct sockaddr_in server;
    
    memset(buf, '0', sizeof(buf));
    if((sock = socket(AF_INET,SOCK_STREAM,0)) == -1) {
        printf("Fehler! Kann Socket nicht erstellen.\n");
	return 1;
    }
    server.sin_family = AF_INET;
    server.sin_port = htons(PORT);
    server.sin_addr.s_addr = inet_addr("127.0.0.1");
   
    //mit Server verbinden
    if(connect(sock,(struct sockaddr*)&server,sizeof(server)) < 0) {
	printf("Verbindung fehlgeschlagen\n");
	return 1;
    }
    while((run = read(sock, buf, sizeof(buf)-1)) > 0) {
	buf[run] = 0;
	if(fputs(buf, stdout) == EOF) { //Ausgabe des fixen Strings
	    printf("\n Error : Fputs error");
	}
	printf("\n");
    }
    
    if(run < 0) {
	printf("\n Read Error \n");
    }
  
    return 0;
}
 
Auf diesen Beitrag antworten »
eulerscheZahl

Wirf mal einen Blick in die Adresszeile, da steht z.B.
http://www.informatikerboard.de/board/thread.php?postid=10105#post10105

Hier ist die Sache etwas komplizierter, da auf dem Server noch php läuft, aber an die URL des Servers (http://www.informatikerboard.de/) wurde noch etwas angehängt. Wird die Seite nicht gefunden, landet man auf der Startseite.

Mal ein anderes Beispiel mit anderer Fehlerbehandlung
https://projecteuler.net/recent -> Unterseite "recent"
https://projecteuler.net/dasuzfhsdfusd -> Seite existiert auf Server nicht, Fehlerseite anzeigen
Auf diesen Beitrag antworten »
deppensido

heißt das dann, dass der Client eine URL-Adresse an den Webserver verschicken soll, z.B. informatikerboard.de und der Webserver soll diese dann zurückschicken? Aber wie kann man dann prüfen, ob eine URL gültig ist? Es soll ja dann ein Fehlercode zurückgegeben werden.
Auf diesen Beitrag antworten »
eulerscheZahl

Der Client fordert eine entsprechende Unterseite an (in meinem 2. Beispiel die Seite recent). Wenn diese vorhanden ist, soll der Server sie auch liefern. Andernfalls wird ein Fehler zurückgegeben.
 
 
Neue Frage »
Antworten »


Verwandte Themen