#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>

void blad()
{
  perror("Blad serwera.");
  exit(1);
}

int main()
{
  int gniazdo_serwera;
  int gniazdo_dla_klienta;
  int serwer_dlugosc;
  int klient_dlugosc;
  int test1,test2,test3,test4,test5;  
  char znak;
  struct sockaddr_un adres_serwera;
  struct sockaddr_un adres_klienta;

  //Usuniecie starego gniazda
  unlink("gniazdo_serwera"); 

  //Utworzenie gniazda serwera
  test1=gniazdo_serwera=socket(AF_UNIX, SOCK_STREAM,0);
  if (test1==-1) blad();

  //Zwiazanie gniazda serwera z adresem
  adres_serwera.sun_family=AF_UNIX;
  strcpy(adres_serwera.sun_path,"gniazdo_serwera");
  serwer_dlugosc=sizeof(adres_serwera); 
  test2=bind(gniazdo_serwera,(struct sockaddr *)&adres_serwera,serwer_dlugosc);
  if (test2==-1) blad();
  
  //Utworzenie kolejki dla oczekujacych polaczen
  test3=listen(gniazdo_serwera,5);
  if (test3==-1) blad();
  
  printf("Serwer nasluchuje...\n");

  //Komunikacja gniazda serwera z gniazdem klienta
  while(1)
    {

    //Przyj‚ęcie polaczenia przez gniazdo serwera
    gniazdo_dla_klienta=accept(gniazdo_serwera,(struct sockaddr *)&adres_klienta,&klient_dlugosc);

    test4=read(gniazdo_dla_klienta,&znak,1);
    if (test4>0) printf("Odebralem do klienta znak %c.\n",znak);
    else blad();

    znak='b';    

    test5=write(gniazdo_dla_klienta,&znak,1);
    if (test5>0) printf("Wysylam dane do klienta znak %c.\n",znak);
    else blad();

    close(gniazdo_dla_klienta);  
    }
  close(gniazdo_serwera);
  exit(0);
}


