Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

14 int

15 main(int argc, char **argv)

16 {

17 if (argc != 1)

18 err_quit("usage: backlog");

19 Socketpair(AF_UNIX, SOCK_STREAM, 0, pipefd);

20 bzero(&serv, sizeof(serv));

21 serv.sin_family = AF_INET;

22 serv.sin_port = htons(PORT);

23 Inet_pton(AF_INET, ADDR, &serv.sin_addr);

24 if ((pid = Fork) == 0)

25 do_child;

26 else

27 do_parent;

28 exit(0);

29 }

30 void

31 parent_alrm(int signo)

32 {

33 return; /* прерывание блокированной функции connect */

34 }

35 void

36 do_parent(void)

27 {

38 int backlog, j, k, junk, fd[MAXBACKLOG + 1];

39 Close(cfd);

40 Signal(SIGALRM, parent_alrm);

41 for (backlog = 0; backlog <= 14; backlogs) {

42 printf("backlog = %d. ", backlog);

43 Write(pfd, &backlog. sizeof(int)); /* сообщение значения дочернему процессу */

44 Read(pfd, &junk, sizeof(int)); /* ожидание дочернего процесса */

45 for (j = 1; j <= MAXBACKLOG; j++) {

46 fd[j] = Socket(AF_INET, SOCK_STREAM, 0);

47 alarm(2);

48 if (connect(fd[j], (SA*)&serv, sizeof(serv)) < 0) {

49 if (errno != EINTR)

50 err_sys("connect error, j = %d", j);

51 printf("timeout, %d connections completed\n", j - 1);

52 for (k = 1; k <= j; k++)

53 Close(fd[k]);

54 break; /* следующее значение backlog */

55 }

56 alarm(0);

57 }

58 if (j > MAXBACKLOG)

59 printf("Id connections?\n", MAXBACKLOG);

60 }

61 backlog = -1; /* сообщаем дочернему процессу, что все сделано */

62 Write(pfd, &backlog, sizeof(int));

63 }

64 void

65 do_child(void)

66 {

67 int listenfd, backlog, junk;

68 const int on = 1;

69 Close(pfd);

70 Read(cfd, &backlog, sizeof(int)); /* ожидание родительского процесса */

71 while (backlog >= 0) {

72 listenfd = Socket(AF_NET, SOCK_STREAM, 0);

73 Setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

74 Bind(listenfd, (SA*)&serv, sizeof(serv));

75 Listen(listenfd, backlog); /* начало прослушивания */

76 Write(cfd, &junk, sizeof(int)); /* сообщение родительскому процессу */

77 Read(cfd, &backlog, sizeof(int)); /* ожидание родительского процесса */

78 Close(listenfd); /* также закрывает все соединения в очереди */

  • Читать дальше
  • 1
  • ...
  • 493
  • 494
  • 495
  • 496
  • 497
  • 498
  • 499
  • 500
  • 501
  • 502
  • 503
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: