Главная страница


ru.unix.bsd

 
 - RU.UNIX.BSD ------------------------------------------------------------------
 From : mitrohin a.s.                        2:5020/400     05 Feb 2006  10:36:50
 To : All
 Subject : ftpd accept loop
 -------------------------------------------------------------------------------- 
 
 ehlo.
 
 в оригинале сделано так.
 
 ftpd.c
 
   ...
 
                 /*
                  * Loop forever accepting connection requests and forking off
                  * children to handle them.
                  */
                 while (1) {
                         FD_COPY(&defreadfds, &readfds);
                         nfds = select(maxfd + 1, &readfds, NULL, NULL, 0);
                         if (nfds <= 0) {
                                 if (nfds < 0 && errno != EINTR)
                                         syslog(LOG_WARNING, "select: %m");
                                 continue;
                         }
 
                         pid = -1;
                         for (i = 1; i <= *ctl_sock; i++)
                                 if (FD_ISSET(ctl_sock[i], &readfds)) {
                                         addrlen = sizeof(his_addr);
                                         fd = accept(ctl_sock[i],
                                             (struct sockaddr *)&his_addr,
                                             &addrlen);
                                         if (fd >= 0) {
                                                 if ((pid = fork()) == 0) {
                                                         /* child */
                                                         (void) dup2(fd, 0);
                                                         (void) dup2(fd, 1);
                                                         close(ctl_sock[i]);
                                                 } else
                                                         close(fd);
                                         }
                                 }
                         if (pid == 0)
                                 break;
                 }
   ...
 
 если ctl_sock - это массив, надо полагать вида 
   [0]=<длина>,[1]..[<длина>]=<дескрипторы>
 то почему такая странная обработка. imho как минимум должно быть
 что-то подобное.
 
   ...
 
                 /*
                  * Loop forever accepting connection requests and forking off
                  * children to handle them.
                  */
                 while (1) {
                         FD_COPY(&defreadfds, &readfds);
                         nfds = select(maxfd + 1, &readfds, NULL, NULL, 0);
                         if (nfds <= 0) {
                                 if (nfds < 0 && errno != EINTR)
                                         syslog(LOG_WARNING, "select: %m");
                                 continue;
                         }
 
                         for (i = 1; i <= *ctl_sock; i++)
                                 if (FD_ISSET(ctl_sock[i], &readfds)) {
                                         addrlen = sizeof(his_addr);
                                         fd = accept(ctl_sock[i],
                                             (struct sockaddr *)&his_addr,
                                             &addrlen);
                                         if (fd >= 0) {
                                                 if ((pid = fork()) == 0) {
                                                         /* child */
                                                         (void) dup2(fd, 0);
                                                         (void) dup2(fd, 1);
                                                         close(ctl_sock[i]);
               close(fd);
               goto Lchild;
                                                 }
                                                 close(fd);
                                         } else
            syslog(LOG_ERR, "accept: %m");
                                 }
                 }
   ...
 
 /swp
 --- ifmail v.2.15dev5.3
  * Origin: BSPU InterNetNews site (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 ftpd accept loop   mitrohin a.s.   05 Feb 2006 10:36:50 
 Re: ftpd accept loop   Valentin Nechayev   05 Feb 2006 11:18:32 
 Re: ftpd accept loop   mitrohin a.s.   05 Feb 2006 15:19:00 
 Re: ftpd accept loop   mitrohin a.s.   06 Feb 2006 10:19:12 
Архивное /ru.unix.bsd/3499eb322421.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional