Операционная система UNIX
Шрифт:
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);
}
Поделиться:
Популярные книги
Измена. Право на сына
4. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Возвышение Меркурия. Книга 7
7. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый
1. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
6.80
рейтинг книги
Идеальный мир для Социопата 12
12. Социопат
Фантастика:
фэнтези
постапокалипсис
рпг
7.00
рейтинг книги
Неудержимый. Книга XIII
13. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
АН (цикл 11 книг)
Аномальный наследник
Фантастика:
фэнтези
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Береги честь смолоду
1. Порог Хирург
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Сын Петра. Том 1. Бесенок
1. Сын Петра
Фантастика:
попаданцы
альтернативная история
6.80
рейтинг книги
Измена. Наследник для дракона
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Воин
2. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.25
рейтинг книги
Сонный лекарь 7
7. Сонный лекарь
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Измена. Жизнь заново
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Мастер 2
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Темный Лекарь
1. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00