#include #include #include #include #include #include #include #include #include #include #include void init_sockets(void) {} #define closesocket(s) close(s) int server_socket = -1; int sock = -1; #define ZEILE_PLATZ 1024 char zeile[ZEILE_PLATZ]; void err_exit(char* msg) { if (server_socket != -1) closesocket(server_socket); } void server_socket_binden(short port) { struct sockaddr_in saddr; if ((server_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) { err_exit("socket() failed"); } memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_port = htons(port); saddr.sin_addr.s_addr = INADDR_ANY; if (bind(server_socket, (struct sockaddr*)&saddr, sizeof(saddr)) < 0) { err_exit("bind() failed"); } if (listen(server_socket, 5) < 0) { err_exit("listen() failed"); } } void verbindung_annehmen(void) { if ((sock = accept(server_socket, NULL, 0)) < 0) { err_exit("accept() failed"); } } int zeile_empf(void) // Zeile vom Socket in zeile lesen { int i = 0; int len; char c; while (1) { len = recv(sock, &c, 1, 0); // ein Zeichen lesen if (len == -1) err_exit("recv() failed"); if (len == 0) return 0; // socket wurde von Gegenstelle geschlossen if (c == 10) { if (i >= 1 && zeile[i - 1] == 13) i--; // CR/LF abschneiden break; } zeile[i] = c; i++; if (i == ZEILE_PLATZ - 1) break; // Zeile zu lang } zeile[i] = 0; return 1; } void zeile_send(void) { strcat(zeile, "\x0d\x0a"); // CR/LF anhngen if (send(sock, zeile, strlen(zeile), 0) == -1) { err_exit("send() failed"); } } int main(void) { int n_access = 1; init_sockets(); server_socket_binden(8080); while (1) { verbindung_annehmen(); while (1) { zeile_empf(); printf("%s\n", zeile); if (zeile[0] == 0) break; } // HTTP Header schicken (ab HTTP 1.0 ntig) strcpy(zeile, "HTTP/1.0 200 OK\n"); strcat(zeile, "Content-Type: text/html\n"); zeile_send(); strcpy(zeile, ""); zeile_send(); // HTML-Seite schicken strcpy(zeile, "

My Simple C Webserver

"); zeile_send(); sprintf(zeile, "Zugriff Nummer: %d ", n_access); zeile_send(); strcpy(zeile, ""); zeile_send(); closesocket(sock); sock = -1; n_access++; } closesocket(server_socket); return 0; }