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

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

Жанры

Основы программирования в Linux
Шрифт:

Когда сервер вызывает

accept
, создается новый сокет, отличающийся от именованного сокета. Этот новый сокет применяется только для взаимодействия с данным конкретным клиентом. Именованный сокет сохраняется для дальнейших подключений других клиентов. Если сервер написан корректно, он может извлечь выгоду из многочисленных подключений. Web-сервер добивается этого за счет одновременного предоставления страниц многих клиентам. В случае простого сервера все последующие клиенты ждут в очереди до тех пор, пока сервер не будет готов снова.

Клиентская сторона системы с применением сокетов гораздо проще. Клиент создает неименованный сокет с помощью вызова

socket
. Затем он вызывает
connect
для подключения к серверу, используя в качестве адреса именованный сокет сервера.

Будучи установлены, сокеты могут применяться как низкоуровневые файловые дескрипторы, обеспечивая двунаправленный обмен данными.

Выполните упражнения 15.1 и 15.2.

Упражнение 15.1. Простой локальный клиент

Далее приведен пример очень простой клиентской программы client1.с. В ней неименованный сокет создается и затем подключается к сокету сервера, названному

server_socket
. Системный вызов
socket
мы подробно рассмотрим чуть позже, когда будем обсуждать некоторые проблемы адресации.

1. Включите нужные заголовочные файлы и задайте переменные:

#include <sys/types.h>

#include <sys/socket.h>

#include <stdio.h>

#include <sys/un.h>

#include <unistd.h>

#include <stdlib.h>

int main {

 int sockfd;

 int len;

 struct sockaddr_un address;

 int result;

 char ch = 'A';

2. Создайте сокет для клиента:

 sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

3. Назовите сокет по согласованию с сервером:

 address.sun_family = AF_UNIX;

 strcpy(address.sun_path, "server_socket");

 len = sizeof(address);

4. Соедините ваш сокет с сокетом сервера:

 result = connect(sockfd, (struct sockaddr *)&address, len);

 if (result == -1) {

perror("oops : client1");

exit(1);

 }

5. Теперь вы можете читать и писать через

sockfd
:

 write(sockfd, &ch, 1);

 read(sockfd, &ch, 1);

 printf("char from server = %c\n", ch);

 close(sockfd);

 exit(0);

}

Эта программа завершится аварийно, если вы попытаетесь выполнить ее, потому что еще не создан именованный сокет сервера, (Точное сообщение об ошибке может отличаться в разных системах.)

$ ./client1

oops: client1: No such file or directory

$

Упражнение 15.2. Простой локальный сервер

Далее приведена программа простого сервера server1.с, которая принимает запрос на соединение от клиента. Она создает сокет сервера, присваивает ему имя, создает очередь ожидания и принимает запросы на соединения.

1. Включите необходимые заголовочные файлы и задайте переменные:

#include <sys/types.h>

#include <sys/socket.h>

#include <stdio.h>

#include <sys/un.h>

#include <unistd.h>

#include <stdlib.h>

int main {

 int server_sockfd, client_sockfd;

 int server_len, client_len;

 struct sockaddr_un server_address;

 struct sockaddr_un client_address;

2. Удалите все старые сокеты и создайте неименованный сокет для сервера:

 unlink("server_socket");

 server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

3. Присвойте имя сокету:

 server_address.sun_family = AF_UNIX;

 strcpy(server_address.sun_path, "server_socket");

 server_len = sizeof(server_address);

 bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

4. Создайте очередь запросов на соединение и ждите запроса клиента:

 listen(server_sockfd, 5);

 while(1) {

char ch;

printf("server waiting\n");

5. Примите запрос на соединение:

client_len = sizeof(client_address);

client_sockfd = accept(server_sockfd,

(struct sockaddr *)&client_address, &client_len);

6. Читайте и записывайте данные клиента с помощью

client_sockfd
:

read(client_sockfd, &ch, 1);

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

Город гибели

МакКаммон Роберт Рик
Фантастика:
ужасы и мистика
мистика
7.78
рейтинг книги
Город гибели

Жребий брошен

Прозоров Александр Дмитриевич
10. Ведун
Фантастика:
фэнтези
8.90
рейтинг книги
Жребий брошен

Параллельные миры

Каку Митио
Научно-образовательная:
прочая научная литература
8.11
рейтинг книги
Параллельные миры

Пламенев. Книга IX

Карелин Сергей Витальевич
9. Пламенев
Фантастика:
аниме
уся
сказочная фантастика
фэнтези
фантастика: прочее
5.00
рейтинг книги
Пламенев. Книга IX

Принадлежать им

Зайцева Мария
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Принадлежать им

Досье «ОДЕССА»

Форсайт Фредерик
Детективы:
политические детективы
7.56
рейтинг книги
Досье «ОДЕССА»

Изменяющий-Механик. Компиляция. Книги 1-18

Усманов Хайдарали
Собрание сочинений
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Изменяющий-Механик. Компиляция. Книги 1-18

Ученик

Первухин Андрей Евгеньевич
1. Ученик
Фантастика:
фэнтези
6.27
рейтинг книги
Ученик

Путь Князя. Возрождение. Часть I

Рокотов Алексей
6. Путь князя
Фантастика:
рпг
попаданцы
5.00
рейтинг книги
Путь Князя. Возрождение. Часть I

Второгодка. Книга 3. Ученье свет

Ромов Дмитрий
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.00
рейтинг книги
Второгодка. Книга 3. Ученье свет

Мастер 6

Чащин Валерий
6. Мастер
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 6

Краем глаза

Кунц Дин Рей
Детективы:
триллеры
8.62
рейтинг книги
Краем глаза

Целительные силы. Книга 1. Очищение организма и правильное питание. Биосинтез и биоэнергетика

Малахов Геннадий Петрович
Дом и Семья:
здоровье и красота
4.00
рейтинг книги
Целительные силы. Книга 1. Очищение организма и правильное питание. Биосинтез и биоэнергетика

Тайна Иппокрены

Белоусов Роман Сергеевич
Документальная литература:
критика
5.00
рейтинг книги
Тайна Иппокрены