Чтение онлайн

на главную - закладки

Жанры

Шрифт:

clnt_addr = (struct sockaddr_in*)call->addr.buf;

printf("Клиент: %s\n", inet_ntoa(clnt_addr->sin_addr));

/* Создадим транспортный узел для обслуживания запроса */

if (ntn = t_open("/dev/tcp", O_RDWR, (struct t_info*)0)) < 0) {

t_error("Ошибка вызова t_open");

exit(1);

}

/* Пусть система сама свяжет его с подходящим
адресом */

if (t_bind(ntn, (struct t_bind*)0), (struct t_bind*)0) < 0) {

t_error("Ошибка вызова t_accept");

exit(1);

}

/* Примем запрос и переведем его обслуживание на новый

транспортный узел */

if (t_accept(tn, ntn, call) < 0) {

t_error("Ошибка вызова t_accept");

exit(1);

}

/* Создадим новый процесс для обслуживания запроса.

При этом родительский процесс продолжает принимать

запросы от клиентов */

if ((pid = fork) == -1) {

t_error("Ошибка вызова fork");

exit(1);

}

if (pid == 0) {

int nbytes;

/* Дочерний процесс: этот транспортный узел уже не нужен,

он используется родителем */

close(tn);

while ((nbytes = t_rcv(ntn, buf,

sizeof(buf), &flags)) != 0) {

t_snd(ntn, buf, sizeof(buf), 0);

}

t_close(ntn);

exit(0);

}

/* Родительский процесс: этот транспортный узел не нужен,

он используется дочерним процессом для обмена данными

с клиентом */

t_close(ntn);

 }

 t_close(ntn);

}

Клиент

#include <sys/types.h>

#include <sys/socket.h>

#include <tiuser.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <stdio.h>

#include <fcntl.h>

#include <netdb.h>

#define PORTNUM 1500

main(argc, argv)

char *argv[];

int argc;

{

 int tn;

 int flags;

 struct sockaddr_in serv_addr;

 struct hostent *hp;

 char buf[80]="Здравствуй,
мир!";

 struct t_call* call;

 /* В качестве аргумента клиенту передается доменное имя хоста,

на котором запущен сервер. Произведем трансляцию доменного

имени в адрес */

 if ((hp = gethostbyname(argv[1])) == 0) {

perror("Ошибка вызова gethostbyname");

exit(1);

 }

 /* Создадим транспортный узел. В качестве поставщика

транспортных услуг выберем модуль TCP */

 printf("Сервер готов\n");

 if ((tn = t_open("/dev/tcp", O_RDWR, NULL)) == -1) {

t_error("Ошибка вызова t_open");

exit(1);

 }

 /* Предоставим системе самостоятельно связать узел с

подходящим адресом */

 if (t_bind(tn, (struct t_bind*)0,

(struct t_bind *)0) < 0} {

t_error("Ошибка вызова t_bind");

exit(1);

 }

 fprintf(stderr, "Адрес клиента: %s\n",

inet_ntoa(serv_addr.sin_addr));

 /* Укажем адрес сервера, с которым мы будем работать */

 bzero(&serv_addr, sizeof(serv_addr));

 bcopy(hp->h_addr, &serv_addr.sin_addr, hp->h_length);

 serv_addr.sin_family = hp->h_addrtype;

 /* Приведем в соответствие порядок следования байтов

для хоста и сети */

 serv_addr.sin_port = htons(PORTNUM);

 /* Поскольку в структуре t_call нам понадобится только буфер

для хранения адреса сервера, разместим ее динамически */

 if ((call =

(struct t_call*)t_alloc(tn, T_CALL, T_ADDR)) == NULL) {

t_error("Ошибка вызова t_alloc");

exit(2);

 }

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

Сердце Дракона. Том 20. Часть 1

Клеванский Кирилл Сергеевич
20. Сердце дракона
Фантастика:
фэнтези
боевая фантастика
городское фэнтези
5.00
рейтинг книги
Сердце Дракона. Том 20. Часть 1

Холодный ветер перемен

Иванов Дмитрий
7. Девяностые
Фантастика:
попаданцы
альтернативная история
6.80
рейтинг книги
Холодный ветер перемен

Последнее желание

Сапковский Анджей
1. Ведьмак
Фантастика:
фэнтези
9.43
рейтинг книги
Последнее желание

Отмороженный 7.0

Гарцевич Евгений Александрович
7. Отмороженный
Фантастика:
рпг
аниме
5.00
рейтинг книги
Отмороженный 7.0

Наследник

Кулаков Алексей Иванович
1. Рюрикова кровь
Фантастика:
научная фантастика
попаданцы
альтернативная история
8.69
рейтинг книги
Наследник

Магия чистых душ 2

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.56
рейтинг книги
Магия чистых душ 2

Наследие Маозари 5

Панежин Евгений
5. Наследие Маозари
Фантастика:
фэнтези
юмористическое фэнтези
5.00
рейтинг книги
Наследие Маозари 5

Локки 4 Потомок бога

Решетов Евгений Валерьевич
4. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Локки 4 Потомок бога

Граф

Ланцов Михаил Алексеевич
6. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Граф

Миф об идеальном мужчине

Устинова Татьяна Витальевна
Детективы:
прочие детективы
9.23
рейтинг книги
Миф об идеальном мужчине

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Здравствуй, 1984-й

Иванов Дмитрий
1. Девяностые
Фантастика:
альтернативная история
6.42
рейтинг книги
Здравствуй, 1984-й

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Барон не играет по правилам

Ренгач Евгений
1. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон не играет по правилам