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

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

Жанры

Основы программирования в Linux
Шрифт:
Упражнение 15.4. Сетевой сервер

Вам также нужно модифицировать серверную программу, ждущую подключений на выбранном вами номере порта. Далее приведена откорректированная программа сервера server2.c.

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

#include <sys/types.h>

#include <sys/socket.h>

#include <stdio.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <unistd.h>

#include <stdlib.h>

int main {

 int server_sockfd, client_sockfd;

 int server_len, client_len;

 struct sockaddr_in server_address;

 struct sockaddr_in client_address;

2. Создайте

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

 server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

3. Дайте имя сокету:

 server_address.sin_family = AF_INET;

 server_address.sin_port.s_addr = inet_addr("127.0.0.1");

 server_address.sin_port = 9734;

 server_len = sizeof(server_address);

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

С этой строки и далее текст примера точно совпадает с программным кодом в файле server1.c. Выполнение client2 и server2 продемонстрирует то же поведение, что и при запуске программ client1 и server1.

Как это работает

Серверная программа создает сокет домена

AF_INET
и выполняет необходимые действия для приема запросов на подключение к нему. Сокет связывается с выбранным вами портом. Заданный адрес определяет, каким машинам разрешено подсоединяться. Задавая такой же адрес виртуальной сети, как в клиентской программе, вы ограничиваете соединения только локальной машиной.

Если вы хотите разрешить серверу устанавливать соединения с удаленными клиентами, необходимо задать набор IP-адресов, которые разрешены. Можно применить специальное значение

INADDR_ANY
для того, чтобы показать, что будете принимать запросы на подключение от всех интерфейсов, имеющихся на вашем компьютере. Если необходимо, вы можете разграничить интерфейсы разных сетей, чтобы отделить соединения локальной сети от соединений глобальной сети. Константа
INADDR_ANY
— 32-разрядное целое число, которое можно использовать в поле
sin_addr.s_addr
адресной структуры. Но прежде вам нужно решить проблему.

Порядок байтов на компьютере и в сети

Если запустить приведенные версии серверной и клиентской программ на машине на базе процессора Intel

под управлением Linux, то с помощью команды
netstat
можно увидеть сетевые соединения. Эта команда есть в большинство систем UNIX, настроенных на работу в сети. Она отображает клиент-серверное соединение, ожидающее закрытия. Соединение закрывается после небольшой задержки. (Повторяем, что вывод в разных версиях Linux может отличаться.)

$ ./server2 & ./client2

[3] 23770

server waiting

server waiting

char from server = В

$ netstat -A inet

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address Foreign Address (State) User

tcp 1 0 localhost:1574 localhost:1174 TIME_WAIT root

Примечание

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

killall server1 server2 server3 server4 server5

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

Отображается локальный адрес (сокет сервера) 1574 (или может выводиться имя сервиса

mvel-lm
) и выбранный в примере порт 9734. Почему они отличаются? Дело в том, что номера портов и адреса передаются через интерфейсы сокета как двоичные числа. В разных компьютерах применяется различный порядок байтов для представления целых чисел. Например, процессор Intel хранит 32-разрядное целое в виде четырех последовательных байтов памяти в следующем порядке 1-2-3-4, где 1-й байт — самый старший. Процессоры IBM PowerPC будут хранить целое со следующим порядком следования байтов: 4-3-2-1. Если используемую для хранения целых память просто побайтно копировать, два компьютера не придут к согласию относительно целочисленных значений.

Для того чтобы компьютеры разных типов могли согласовать значения многобайтовых целых чисел, передаваемых по сети, необходимо определить сетевой порядок передачи байтов. Перед передачей данных клиентские и серверные программы должны преобразовать собственное внутреннее представление целых чисел в соответствии с принятым в сети порядком следования байтов. Делается это с помощью функций, определенных в заголовочном файле netinet/in.h. К ним относятся следующие:

#include <netinet/in.h>

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

Некромант . Трилогия

Петерсон Андрей Викторович
Перстень некромансера
Фантастика:
фэнтези
7.64
рейтинг книги
Некромант . Трилогия

По зову сердца

Меллер Юлия Викторовна
Фантастика:
фэнтези
6.40
рейтинг книги
По зову сердца

Вернувшийся: Первые шаги. Том II

Vector
2. Вернувшийся
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Вернувшийся: Первые шаги. Том II

Чтоб знали! Избранное (сборник)

Армалинский Михаил Израилевич
Русская потаенная литература
Поэзия:
поэзия
5.00
рейтинг книги
Чтоб знали! Избранное (сборник)

"Фантастика 2025-79". Компиляция. Книги 1-32

Буланова Наталья Александровна
Фантастика 2025. Компиляция
Фантастика:
боевая фантастика
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Фантастика 2025-79. Компиляция. Книги 1-32

Астроном

Шехтер Яков
Проза:
современная проза
5.00
рейтинг книги
Астроном

Двенадцатая реинкарнация. Трилогия

Богдашов Сергей Александрович
Фантастика:
боевая фантастика
5.60
рейтинг книги
Двенадцатая реинкарнация. Трилогия

"Фантастика 2023-134". Компиляция. Книги 1-22

Демина Карина
Фантастика 2023. Компиляция
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
Фантастика 2023-134. Компиляция. Книги 1-22

Как воспитать здорового и умного ребенка. Ваш малыш от А до Я

Шалаева Галина Петровна
Научно-образовательная:
педагогика
5.00
рейтинг книги
Как воспитать здорового и умного ребенка. Ваш малыш от А до Я

Страдание

Гамильтон Лорел Кей
22. Анита Блейк
Фантастика:
фэнтези
ужасы и мистика
8.37
рейтинг книги
Страдание

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.25
рейтинг книги
Аристократ из прошлого тысячелетия

Досье Дрездена. Книги 1 - 15

Батчер Джим
Досье Дрездена
Фантастика:
фэнтези
ужасы и мистика
5.00
рейтинг книги
Досье Дрездена. Книги 1 - 15

Имперец. Том 3

Романов Михаил Яковлевич
2. Имперец
Фантастика:
боевая фантастика
попаданцы
альтернативная история
7.50
рейтинг книги
Имперец. Том 3

"Фантастика 2023-201. Компиляция. Книги 1-26

Кароль Елена
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Фантастика 2023-201. Компиляция. Книги 1-26