Skip to Content

Лабораторная работа №5

Задание на лабораторную работу

  1. Изучить документацию к функциям fork (man fork), setsid (man setsid)
  2. Добавить возможность серверному приложению из предыдущего задания одновременно открывать несколько сессий.
  3. По желанию: обеспечить передачу сообщений между клиентами.

Приложение. Пример работы с сокетами

  int listensocket,datasocket;
  int  pid;

  signal (SIGCHLD, SIG_IGN); //auto-close child processes 


  /*
    open and bind listensocket here
  */
 

  if ((pid=fork())==-1)
  {
   globalerror(stderr,"Error: global fork");
   exit(1);
  }
  if (pid) exit(0); //End parent

  fclose(stdin); //Close standart input and output streams 
  fclose(stdout);
  fclose(stderr);
  setsid(); // De-attach terminal

 if (listen(listensocket,5)==-1)
 {
  globalerror("Error: listen()");
  exit(1);
 }
 while (1)
 {
  int addrlen;

  bzero(&clnt_addr, sizeof(clnt_addr));
  addrlen=sizeof(clnt_addr);
  if ((datasocket=accept(s, (struct sockaddr *)&clnt_addr, 
   &addrlen))==-1) // accept new connection

  {
   globalerror("Error: accept()");
   exit(1);
  }
  if ((pid=fork())==-1)
  {
   globalerror("Error: fork()");
   exit(1);
  }
  if (pid==0) //Child

  {

   close(listensocket);
   /* 
    some work here
   */
   close(datasocket);
   exit(0);
  }
  //Parent
  close(datasocket);
 }
}