All pastes #2019213 Raw Edit

Anonymous

public text v1 · immutable
#2019213 ·published 2010-12-14 10:07 UTC
rendered paste body
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
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, 
            "<html><body><h2>My Simple C Webserver</h2>");
        zeile_send();
        sprintf(zeile, 
            "Zugriff Nummer: %d </body></html>", n_access);
        zeile_send();
        strcpy(zeile, "");
        zeile_send();

        closesocket(sock);
        sock = -1;
        n_access++;
    }
    closesocket(server_socket);
    return 0;
}