Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
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_in
AF_INET
inet_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_ANY
INADDR_ANY
sin_addr.s_addr
Порядок байтов на компьютере и в сети
Если запустить приведенные версии серверной и клиентской программ на машине на базе процессора Intel под управлением Linux, то с помощью команды
netstat
$ <b>./server2 & ./client2</b>
[3] 23770
server waiting
server waiting
char from server = В
$ <b>netstat -A inet</b>
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