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

на главную

Жанры

TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security)

Фейт Сидни М.

Шрифт:

6. child = fork;

close(sockMain);

В языке С команда fork создает новый дочерний процесс, который наследует все дескрипторы ввода/вывода родительской программы, а также имеет доступ к sockMain и sockClient. Операционная система отслеживает количество процессов, имеющих доступ к socket.

Соединение закрывается, когда последний обращающийся к socket процесс вызывает close.

Когда дочерний процесс закрывает sockMain, родительский процесс все еще имеет доступ к socket.

7. close(sockClient);

Этот вызов выполняется из родительской части программы. Когда родительский процесс закрывает sockClient, дочерний процесс все еще имеет доступ к socket.

8. msgLength = recv(sockClient, buf, BUFLEN, 0));

close(sockClient);

Вызов recv имеет форму:

длина_сообщения = recv(дескриптор_socket, буфер, длина_буфера, флаги)

По умолчанию вызов recv блокированный. Функции fcntl или iocntl позволяют изменить статус socket на неблокированный режим.

После получения данных дочерним процессом и вывода сообщения на печать, доступ к sockClient закрывается. Это заставит соединение перейти в фазу закрытия.

21.7 Клиентская программа TCP

Клиент соединяется с сервером, посылает одно сообщение, и далее работа программы завершается (фрагменты программы рассматриваются в следующем разделе). Для запуска программы конечный пользователь должен ввести имя хоста сервера, номер порта и сообщение, которое будет послано на этот сервер. Например:

tcpclient pltim.cs.yale.edu 1356 hello

/* tcpclient.с

 * Перед запуском клиента должен быть запущен сервер. Производится

 * поиск порта сервера. Для запуска клиента нужно ввести:

* tcpclient имя_хоста порт сообщение */

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#include <stdio.h>

#include <errno.h>

main(argc, argv) /* Клиентская программа имеет входные аргументы. */

int argc;

char* argv[];

{

 int sock;

 struct sockaddr_in servAddr;

 struct hostent *hp, *gethostbyname;

 /* Аргументами будут 0:имя_программы, 1:имя_хоста, 2:порт, 3:сообщение */

 if (argc < 4)
{

printf("ВВЕСТИ tcpclient
имя_хоста порт сообщение\n");

exit(1);

 }

 /* 1. Создание TCB. */

 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {

perror("He могу получить socket\n");

exit(1);

 }

 /* 2. Заполнить поля адреса и порта сервера в servAddr.

* Сначала заполнить нулями адресную структуру. Затем получить IP-адрес

* для данного имени хоста и ввести его в адресную структуру.

* Наконец ввести номер порта, взяв его из argv[2]. */

 bzero((char *)&servAddr, sizeof(servAddr));

 servAddr.sin_family = AF_INET;

 hp = gethostbyname (argv[1]);

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

 servAddr.sin_port = htons(atoi(argv[2]));

 /* 3. Соединиться с сервером. Вызывать bind не нужно.

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

 if (connect (sock, &servAddr, sizeof(servAddr)) < 0) {

perror("Клиент не может соединиться.\n");

exit(1);

 }

 /* 4. Клиент анонсирует свою готовность послать сообщение.

* Сообщение отправляется, и распечатывается последняя строка. */

 printf ("CLIENT: Готов к пересылке\n");

 if (send(sock, argv[3], strlen(argv[3]), 0) < 0) {

(perror("Проблемы с пересылкой.\n");

exit(1);

 }

 printf ("CLIENT: Пересылка завершена. Счастливо оставаться.\n");

 close(sock);

 exit(0);

}

21.7.1 Вызовы в клиентской программе TCP

1. sock = socket(AF_INET, SOCK_STREAM, 0);

Клиент создает блок управления пересылкой ("socket") так же, как это делал сервер.

2. Сервер должен инициализировать адресную структуру для использования в bind.

Эта структура содержит локальный IP-адрес и номер порта сервера. Клиент также инициализирует адресную структуру, хранящую те же сведения. Эта структура будет использоваться в вызове connect для указания точки назначения.

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

Сила рода. Том 3

Вяч Павел
2. Претендент
Фантастика:
фэнтези
боевая фантастика
6.17
рейтинг книги
Сила рода. Том 3

Измена. Истинная генерала драконов

Такер Эйси
1. Измены по-драконьи
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Измена. Истинная генерала драконов

Убивать чтобы жить 7

Бор Жорж
7. УЧЖ
Фантастика:
героическая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 7

Самый лучший пионер

Смолин Павел
1. Самый лучший пионер
Фантастика:
попаданцы
альтернативная история
5.62
рейтинг книги
Самый лучший пионер

Завод 2: назад в СССР

Гуров Валерий Александрович
2. Завод
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Завод 2: назад в СССР

Я тебя не предавал

Бигси Анна
2. Ворон
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Я тебя не предавал

Весь цикл «Десантник на престоле». Шесть книг

Ланцов Михаил Алексеевич
Десантник на престоле
Фантастика:
альтернативная история
8.38
рейтинг книги
Весь цикл «Десантник на престоле». Шесть книг

Газлайтер. Том 17

Володин Григорий Григорьевич
17. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 17

Курсант: назад в СССР 2

Дамиров Рафаэль
2. Курсант
Фантастика:
попаданцы
альтернативная история
6.33
рейтинг книги
Курсант: назад в СССР 2

Сердце Дракона. Том 9

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

Газлайтер. Том 1

Володин Григорий
1. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 1

Белые погоны

Лисина Александра
3. Гибрид
Фантастика:
фэнтези
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Белые погоны

Кротовский, сколько можно?

Парсиев Дмитрий
5. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кротовский, сколько можно?

Мимик нового Мира 6

Северный Лис
5. Мимик!
Фантастика:
юмористическая фантастика
попаданцы
рпг
5.00
рейтинг книги
Мимик нового Мира 6