Dies ist eine alte Version des Dokuments!


einfaches Codebeispiel für Socketprogrammierung

socket.c
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
 
#define PORT 8000
 
int main ( int argc, char* argv[] )
{
    // structs für die Aufnahme der IP-Adresse, etc von Server und Clientsockets
    struct sockaddr_in servaddr;
    struct sockaddr_in clientaddr;
    // Identifikatoren für Server / ClientSockets
    int sockfd, clientfd;
 
    // Pufferspeicher
    char buffer[1024];
 
    // Erzeugen des Sockets als Internetsocket und SOCK_STREAM (TCP)
    if ((sockfd = socket (PF_INET, SOCK_STREAM, 0)) ==-1 )
    {
        printf ("SOCKETOPEN FAILED\n"); 
        exit(0);
    }
 
    // Serveraddressen setzen. (Port ist oben definiert, AF_INET => Internet, INADDR_ANY => über alle IP-Adressen
    memset( &servaddr, 0, sizeof( servaddr ) );
    servaddr.sin_family      = AF_INET;
    servaddr.sin_port        = htons( PORT );
    servaddr.sin_addr.s_addr = htonl( INADDR_ANY  );
 
    // binden des Sockets (also "scharfmachen" des Sockets)
    if (bind( sockfd, (struct sockaddr*) &servaddr, sizeof(servaddr) ) < 0)
    {
        printf ("SOCKETBIND FAILED\n"); 
        close(sockfd);
        exit(0);
    }
 
    // beginn des lauschens
    if (listen ( sockfd, 10 ) < 0 )
    {
        printf("LISTEN FAILED\n");
        close( sockfd );
        exit(0);
    }
 
    int x=sizeof(clientaddr);
    // warten auf Verbindung durch einen Client, danach Kommunikation über clientfd.
    clientfd = accept( sockfd, (struct sockaddr *) &clientaddr, &x );
 
    // lesen aus dem Socket und direkt Ausgabe des Gelesenen auf der stdout    
    read(clientfd, buffer, 1024);
    printf ("%s", buffer);
 
    // Puffer für die HTTP-Antwort
    char resp[]="HTTP/1.0 200 OK\nContent-Type: text/html\n\nHallo\n\n\n\0";
 
    // Senden der Antwort
    write (clientfd, resp, sizeof(resp));
    // Abbrechen der TCP-Verbindung
    shutdown (clientfd, 1);
    // Internes schließen des Clientsockets (Freigabe des Ports)
    close (clientfd);
    // Internes schließen des Serversockets
    close (sockfd);
}