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;
}
|