Книга: UNIX: взаимодействие процессов

Управление соединением по TCP

Управление соединением по TCP

Если мы будем наблюдать с помощью tcpdump за работой клиента и сервера из предыдущего примера, связывающихся по протоколу TCP, мы увидим, что сначала происходит установка соединения (трехэтапное рукопожатие TCP), затем отправляется запрос клиента и сервер отсылает уведомление о приеме этого запроса. Через 25 секунд после этого клиент отсылает серверу FIN, что вызвано завершением работы клиента, после чего следуют оставшиеся три этапа завершения соединения по TCP. В разделе 2.5 [24] эти этапы описаны подробно.

Мы хотим показать, что Sun RPC использует соединение по TCP следующим образом: новое соединение по TCP устанавливается при вызове clnt_create и оно используется для всех вызовов процедур, связанных с указанной программой и версией. Соединение по TCP завершается явно вызовом clnt_destroy или неявно по завершении процесса клиента:

#include <rpc/rpc.h>
void clnt_destroy(CLIENT *cl);

Начнем с клиента из листинга 16.2 и изменим его, добавив второй вызов процедуры сервера, вызовы clnt_destroy и pause. В листинге 16.10 приведен текст новой программы-клиента.

Листинг 16.10. Клиент для изучения свойств соединения по TCP

//sunrpc/square9/client.c
1  #include "unpipc.h" /* наш заголовочный файл*/
2  #include "square.h" /* создается rpcgen */
3  int
4  main(int argc, char **argv)
5  {
6   CLIENT, *cl;
7   square_in in;
8   square_out *outp;
9   if (argc != 3)
10   err_quit("usage: client <hostname> <integer-value>");
11  cl = Clnt_create(argv[1], SQUARE_PROG, SQUARE_VERS, "tcp");
12  in.arg1 = atol(argv[2]);
13  if ((outp = squareproc_1(&in, cl)) == NULL)
14   err_quit("%s", clnt_sperror(c1, argv[1]));
15  printf("result: %ldn", outp->res1);
16  in.arg1 *= 2;
17  if ((outp = squareproc_1(&in, cl)) == NULL)
18   err_quit("%s", clnt_sperror(cl, argv[1]));
19  printf("result: %ldn", outp->res1);
20  clnt_destroy(cl);
21  pause();
22  exit(0);
23 }

После запуска получим ожидаемый результат:

solaris % client kalae 5
result: 25
result: 100
программа в состоянии ожидания, пока мы не завершим ее вручную

Однако проверить наши предыдущие утверждения можно лишь с помощью результатов работы программы tcpdump. Она показывает, что создается одно соединение по TCP (вызовом clnt_create) и оно используется для обоих запросов клиента. Соединение завершается вызовом clnt_destroy, хотя клиент при этом и не завершает свою работу.

Оглавление книги


Генерация: 1.197. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз