Эффективное программирование TCP-IP




Совет 18. Подумайте о том, чтобы - часть 2


Например, если вы захотите запустить сервис подсчета строк из совета 17 в качестве TCPMUX-сервера, то надо добавить в файл inetd. conf строку

tcpmux/+rlnumd stream tcp nowait jcs /usr/jome/jcs/rlnumd rlnumd

Для тестирования заставьте inetd перечитать свой конфигурационный файл, а затем подсоединитесь к нему с помощью telnet, указав имя сервиса TCPMUX:

bsd: $ telnet localhost tcpmux

Trying 127.0.0.1 ...

Connected to localhost

Escape character is "^]".

rlnumd

+Go

hello

 1: hello

world

 2: world А]

telnet> quit

Connection closed

bsd: $

К сожалению, сервис TCPMUX поддерживается не всеми операционными системами и даже не всеми UNIX-системами. Но, с другой стороны, его реализация настолько проста, что возможно написать собственную версию. Поскольку TCPMUX должен делать почти то же, что и inetd (за исключением мониторинга нескольких шкетов), заодно будут проиллюстрированы те идеи, которые лежат в основе inetd. Начнем с определения констант, глобальных переменных и функции main (листинг 3.7).

Листинг 3.7. tcpmux - константы, глобальные переменные и main

1    #include"etcp.h"

2    #define MAXARGS 10 /*Максималиное число аргументов сервера.*/

3    #define MAXLINE 256 /*Максимальная длина строки в tcpmux.conf.*/

4    #define NSERVTAB 10 /*Число элементов в таблице service_table.*/

5    #define CONFIG “tcpmux.conf”

6    typedef  struct

7    {

8    int flag;

9    char *service;

10   char *path;

11   char *args[ MAXARGS + 1 ];

12   } servtab_t;

13   int ls; /* Прослушиваемый сокет. */

14   servtab_t service_table[ NSERVTAB + 1 ];

15   int main( int argc, char **argv )

16   {

17   struct sockaddr_in peer;

18   int s;

19   int peerlen;

20   /* Инициализировать и запустить сервер tcpmux. */

21   INIT ();

22   parsetab ();

23   switch ( argc }

24   {

25     case 1: /* Все по умолчанию. */

26      ls = tcp_server( NULL, "tcpmux" );

27      break;

28     case 2  /* Задан интерфейс и номер порта. */

29      ls = tcp_server( argv[ 1 ], "tcpmux" );




Содержание  Назад  Вперед