Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
char ch = 'A';2. Создайте сокет клиента:
<i> sockfd = socket(AF_INET, SOCK_STREAM, 0);</i>3. Присвойте имя сокету по согласованию с сервером:
<i> address.sin_family = AF_INET;</i><i> address.sin_addr.s_addr = inet_addr("127.0.0.1");</i><i> address.sin_port = 9734;</i> len = sizeof(address);Оставшаяся часть программы такая же, как в приведенном ранее в этой главе примере. Когда вы выполните эту версию, она завершится аварийно, потому что на данном компьютере нет сервера, выполняющегося на порте 9734.
$ <b>./client2</b>oops: client2: Connection refused$Как это работает
Клиентская программа использует структуру
sockaddr_inAF_INETinet_addrВам также нужно модифицировать серверную программу, ждущую подключений на выбранном вами номере порта. Далее приведена откорректированная программа сервера server2.c.
1. Вставьте необходимые заголовочные файлы и задайте переменные:
#include <sys/types.h>#include <sys/socket.h>#include <stdio.h><i>#include <netinet/in.h></i><i>#include <arpa/inet.h></i>#include <unistd.h>#include <stdlib.h>int main() { int server_sockfd, client_sockfd; int server_len, client_len;<i> struct sockaddr_in server_address;</i><i> struct sockaddr_in client_address;</i>2. Создайте неименованный сокет для сервера:
<i> server_sockfd = socket(AF_INET, SOCK_STREAM, 0);</i>3. Дайте имя сокету:
<i> server_address.sin_family = AF_INET;</i><i> server_address.sin_port.s_addr = inet_addr("127.0.0.1");</i><i> server_address.sin_port = 9734;</i> server_len = sizeof(server_address); bind(server_sockfd, (struct sockaddr *)&server_address, server_len);С этой строки и далее текст примера точно совпадает с программным кодом в файле server1.c. Выполнение client2 и server2 продемонстрирует то же поведение, что и при запуске программ client1 и server1.
Как это работает
Серверная программа создает сокет домена
AF_INETЕсли вы хотите разрешить серверу устанавливать соединения с удаленными клиентами, необходимо задать набор IP-адресов, которые разрешены. Можно применить специальное значение
INADDR_ANYINADDR_ANYsin_addr.s_addrПорядок байтов на компьютере и в сети
Если запустить приведенные версии серверной и клиентской программ на машине на базе процессора Intel под управлением Linux, то с помощью команды
netstat$ <b>./server2 & ./client2</b>[3] 23770server waitingserver waitingchar from server = В$ <b>netstat -A inet</b>Active Internet connections (w/o servers)Proto Recv-Q Send-Q Local Address Foreign Address (State) Usertcp 1 0 localhost:1574 localhost:1174 TIME_WAIT rootПрежде чем испытывать последующие примеры этой главы, убедитесь в том, что завершено выполнение серверных программ-примеров, поскольку они будут конкурировать при приеме соединений клиентов, и вы увидите вводящие в заблуждение результаты. Удалить их все (включая те, что будут приведены позже в этой главе) можно с помощью следующей команды:
killall server1 server2 server3 server4 server5Вы сможете увидеть номера портов, присвоенные соединению сервера с клиентом. Локальный адрес отображает сервер, а внешний адрес — удаленного клиента. (Даже если клиент размещен на той же машине, он все равно подключается через сеть.) Для четкого разделения всех сокетов порты клиентов обычно отличаются от сокета сервера, ожидающего запросы на соединения, и уникальны в пределах компьютера.
Отображается локальный адрес (сокет сервера) 1574 (или может выводиться имя сервиса
mvel-lm