portal Michała Hanćkowiaka
Begin main content
/*
  Gniazdka, najprostszy przyklad ...
  ----------------------------------
*/

#include "unix.h"
#define PORT 7000

void ObsSygnalu(int p)
{ printf("pojawil sie sygnal SIGPIPE !!! (pid==%i)\n",getpid());
}
char *AdresCyfrowyKropkowy(char *name);

main()
{
  signal(SIGPIPE,ObsSygnalu);
    // na wszelki wypadek ...

  int pid,status,i,j;
  pid=fork();
  if(pid==0) // pp: tutaj bedzie serwer ...
  {
    printf("serwer: pid==%i\n",getpid());

    int sock=socket (AF_INET,SOCK_STREAM,0);

    struct sockaddr_in adres;
    memset(&adres,0,sizeof(adres));
    adres.sin_family=AF_INET;
    //adres.sin_addr.s_addr=inet_addr(AdresCyfrowyKropkowy("venus"));
    //adres.sin_addr.s_addr=INADDR_ANY;
    adres.sin_addr.s_addr=inet_addr(AdresCyfrowyKropkowy("localhost"));
    adres.sin_port=htons(PORT);
    i=bind(sock,(struct sockaddr *)&adres,sizeof(adres));
    printf("serwer: bind()=%i\n",i);

    listen(sock,5);

    // czekamy na dokladnie 2 klientow !
    //
    int licznik;
    for(licznik=1;licznik<=2;licznik++)
    {
      printf("serwer: czekam na klienta nr %i\n",licznik);
      int nowy_sock=accept(sock,NULL,NULL);
      printf("serwer: accept()=%i\n",nowy_sock);
      printf("serwer: poczatek obslugi klienta nr %i\n",licznik);

      char buf[100];
      i=read(nowy_sock,buf,99);
      buf[i]=0;
      printf("serwer: read()=%i buf=%s\n",i,buf);

      j=write(nowy_sock,buf,i);
      printf("serwer: write()=%i\n",j);
        // jak widac serwer dziala jak 'echo'
        // odsyla to co przyszlo !

      close(nowy_sock);
    }

    close(sock);
    exit(0);
  }
  else // pm: tutaj bedzie klient ...
  {
    printf("klient: pid==%i\n",getpid());

    extern void klient(char *);

    sleep(1);
    printf("klient: pierwsze polaczenie ...\n");
    klient("1234567890");

    sleep(1);
    printf("klient: drugie polaczenie ...\n");
    klient("QWERTYUIOP");

    i=wait(&status);
    printf("klient: wait()=%i %04X\n",i,status);
  }
}

void klient(char *c)
{
  int i,j;
  int sock=socket (AF_INET,SOCK_STREAM,0);

  struct sockaddr_in adres;
  memset(&adres,0,sizeof(adres));
  adres.sin_family=AF_INET;
  //adres.sin_addr.s_addr=inet_addr(AdresCyfrowyKropkowy("venus"));
  //adres.sin_addr.s_addr=inet_addr("1.2.3.4");
  //adres.sin_addr.s_addr=INADDR_ANY;
  adres.sin_addr.s_addr=inet_addr(AdresCyfrowyKropkowy("localhost"));
  adres.sin_port=htons(PORT);
  i=connect(sock,(struct sockaddr *)&adres,sizeof(adres));
  printf("klient: connect()=%i\n",i);

  i=write(sock,c,strlen(c));
  printf("klient: write()=%i\n",i);

  char buf[100];
  i=read(sock,buf,99);
  buf[i]=0;
  printf("klient: read()=%i buf=%s\n",i,buf);

  close(sock);
}

typedef struct in_addr in_addr_mh;
  // naprawde trzeba to tak robic???

char *AdresCyfrowyKropkowy(char *name)
{
  struct hostent *hostp;
  if ((hostp=(struct hostent *)gethostbyname(name))!=NULL)
  {
    return inet_ntoa(*(in_addr_mh*)*hostp->h_addr_list);
      // jak dlugo ten wynik istnieje ??????
  }
}

uwaga: portal używa ciasteczek tylko do obsługi tzw. sesji...