/******************************************/
/*                                        */
/*  Prof. Dr. Carsten Vogt                */
/*  Fachhochschule Koeln                  */
/*  Fakultaet 07, Nachrichtentechnik      */
/*  http://www.nt.fh-koeln.de/vogt        */
/*                                        */
/*  UNIX-C-Schnittstelle:                 */
/*  Kommunikation ueber lokale Sockets    */
/*  Hier: Serverprozess als Empfaenger;   */
/*  Clientprozess als Sender in           */
/*  socket_client.c.                      */
/*  (Erst den Server-(Empfaenger-)prozess */
/*   im Hintergrund starten, dann den     */
/*   Client-(Sender-)Prozess.)            */
/*                                        */
/******************************************/

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>

main() {

 /* Identifikatoren fuer die Socket, ueber die Verbindungs-
    aufbauwuensche von Clients entgegengenommen werden (sd_acc),
    und fuer die Socket, die dann zur Kommunikation mit einem 
    bestimmten Client benutzt wird. */

 int sd_acc, sd_comm;

 int addr_len; /* Hilfsvariable */

 char buf[256]; /* zur Aufnahme der empfangenen Nachricht */

 struct sockaddr server_addr, client_addr;

 /* Erzeugung einer eigenen Socket, ueber die Verbindungs-
    aufbauwuensche von Clients entgegengenommen werden. */

 sd_acc = socket(AF_UNIX,SOCK_STREAM,0);

 /* Anbinden einer Adresse an die eigene Socket
    (Hier: lokaler Socketname "Socket_1".) */

 server_addr.sa_family = AF_UNIX;
 strcpy(server_addr.sa_data,"Socket_1");
 bind(sd_acc,&server_addr,sizeof(struct sockaddr));

 /* Festlegung der Anzahl der noch nicht bearbeiteten Verbindungs-
    aufbauwuensche, die an dieser Socket warten koennen. */

 listen(sd_acc,1);

 /* Warten, bis ein Verbindungsaufbauwunsch eintrifft,
    und Akzeptieren dieses Wunschs. Ab dann "steht" die Verbindung. */

 addr_len = sizeof(client_addr);
 sd_comm = accept(sd_acc,&client_addr,&addr_len);

 /* Entgegennahme einer Nachricht des Partners */

 sleep(2);

 read(sd_comm,buf,sizeof(buf));
 printf("\nGelesen: %s\n\n",buf);

 /* Schliessen und Loeschen der Socket */

 close(sd_acc);
 close(sd_comm);
 unlink("Socket_1");

}
