Листинг Д.7. Определение фактического количества собранных в очередь соединений для различных значений аргумента backlog
//debug//backlog.c
1 #include "unp.h"
2 #define PORT 9999
3 #define ADDR "127 0.0.1"
4 #define MAXBACKLOG 100
5 /* глобальные переменные */
6 struct sockaddr_in serv;
7 pid_t pid; /* дочерний процесс */
8 int pipefd[2];
9 #define pfd pipefd[1] /* сокет родительского процесса */
10 #define cfd pipefd[0] /* сокет дочернего процесса */
11 /* прототипы функций */
12 void do_parent(void);
13 void do_child(void);
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)); /* ожидание родительского процесса */
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии