#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.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;  
  struct sockaddr_in adres_serwera;
  struct sockaddr_in adres_klienta;

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

  //Zwiazanie gniazda serwera z adresem
  adres_serwera.sin_family=AF_INET;
  adres_serwera.sin_addr.s_addr=inet_addr("127.0.0.1");
  adres_serwera.sin_port=9734;
  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)
    {
    char znak;

    //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 od klienta znak %c.\n",znak);
    else blad();

    znak='b';    

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

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


