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

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

Жанры

Linux: Полное руководство

Аллен Питер В.

Шрифт:

Программа-клиент несколько проще, чем сервер. Вот ее листинг:

Листинг 27.4. Программа-клиент

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#include <memory.h>

#include <stdio.h>

#define SERVER_HOST "localhost"

#define SERVER_PORT 1234

#define CLIENT_PORT 1235

#define MSG "Denis\n"

main {

 int sock;

 int ans_len;

 int BUF_SIZE = 64;

 char buffer[BUF_SIZE];

 struct hostent *h;

 struct sockaddr_in client, server;

 sock = socket(AF_INET, SOCK_STREAM, 0);

 memset((char *)&client, '\0', sizeof(client));

 client.sin_family = AF_INET;

 client.sin_addr.s_addr = INADDR_ANY;

 client.sin_port = CLIENT_PORT;

 bind(sock, (struct sockaddr *)&client, sizeof(client));

 memset((char *)&client, '\0', sizeof(server));

 h = gethostbyname(SERVER_HOST);

 server.sin_family = AF_INET;

 memcpy((char *)&server.sin_addr.h->h_addr, h->h_length);

 server.sin_port = SERVER_PORT;

 connect(sock, &server, sizeof(server));

 ans_len = recv(sock, buffer, BUF_SIZE, 0);

 write(1, buffer, ans_len);

 send(sock, MSG, sizeof(MSG), 0);

 close(sock);

 exit(0);

}

Константа MSG —

это сообщение, которое будет передано серверу. Как и в случае с сервером, нам понадобятся две структуры типа sockaddr_in:

struct hostent *h;

struct sockaddr_in client, server;

Структура типа hostent нам нужна для получения адреса сервера.

Создаем сокет, заполняем информацию о клиенте и связываем сокет:

sock = socket(AF_INET, SOCK_STREAM, 0);

memset((char *)&client, '\0' , sizeof(client));

client.sin_family = AF_INET;

client.sin_addr.s_addr = INADDR_ANY;

client.sin_port = CLIENT_PORT;

bind(sock, (struct sockaddr *)&client, sizeof(client));

Перед подключением к серверу нужно определить его IP-адрес:

h = gethostbyname(SERVER_HOST);

Подключаемся к серверу:

server.sin_family = AF_INET; // набор протоколов

memcpy((char *)&server.sin_addr, h->h_addr, h->h_length);

// задаем адрес сервера

server.sin_port = SERVER_PORT; // указываем порт сервера

connect(sock, &server, sizeof(server));

После подключения к серверу принимаем его запрос, выводим на стандартный вывод, отправляем серверу свое сообщение и закрываем сокет:

ans_len = recv(sock, buffer, BUF_SIZE, 0);

write(1, buffer, ans_len);

send(sock, MSG, sizeof(MSG), 0);

close(sock);

27.3.9. Установка опций сокета

Поскольку мы используем набор протоколов AF_INET, то в этом пункте

будем рассматривать только те опции сокетов, которые относятся к этому набору. Для работы с опциями сокета используются две функции:

♦ getsockopt — получение опций сокета;

♦ setsockopt — установка опций сокета.

Прототипы этих функций выглядят так:

#include <sys/socket.h>

int getsockopt(int sd, int level, int option_name,

 void *restrict option_value, socklen_t *restrict option_len);

int setsockopt(int sd, int level, int option_name,

 const void *option_value, socklen_t option_len);

Первый параметр, sd, — это дескриптор сокета. Второй параметр — уровень доступа (существует только один уровень — SOL_SOCKET). Следующий параметр, option_name, — это название опции, значение которой вы хотите изменить (см. таблицу 27.10). Последние два параметра — это значение опции и его размер.

Наиболее часто используемые опции сокетов Таблица 27.10

Название опции Описание
SO_DEBUG Включить/выключить (1/0) запись отладочной информации для сокета
SO_BROADCAST Включить/выключить (1/0) отправку широковещательных сообщений
SO_REUSEADDR Опция разрешает/запрещает использование локальных адресов
SO_KEEPALIVE Сохраняет неактивные соединения "в живых" путем посылки сообщений. Если данный сокет не отвечает на сообщения, соединение будет разорвано, а процессу, который осуществлял запись в сокет, будет послан сигнал SIGPIPE. Для включения KEEPALIVE нужно установить значение 1, для выключения — 0
SO_SNDBUF Устанавливает размер буфера отправки, значение целого типа
SO_RCVBUF Устанавливает размер буфера приема, значение целого типа
SO_SNDTIMEO Установка таймаута для отправки сообщений. По умолчанию таймаут равен 0, то есть его вообще нет. Нужно передать значение типа struct timeval
SO_RCVTIMEO Установка таймаута для приема сообщений. По умолчанию таймаут равен 0, то есть его вообще нет. Нужно передать значение типа struct timeval
TCP_NODELAY Отключить (1) механизм буферизации сообщений, то есть они будут отправляться сразу, без задержки. Для включения механизма буферизации нужно указать значение 0
TCP_MAXSEG Установить максимальный сегмент данных. Значение целого типа
TCP_NOPUSH Не использовать проталкивание (1)
TCP_NOOPT Не использовать опции TCP (1). Для использования опций передайте значение 0

В случае успешной установки параметра функция setsockopt возвращает 0; в случае ошибки возвращается -1, а переменная errno устанавливается следующим образом:

♦ EBADF — неверный дескриптор сокета:

♦ ENOTSOCK — указанный дескриптор является файлом, а не сокетом;

♦ EFAULT — нет доступа к адресу, на который указывает указатель

optval
, то есть данный адрес находится за пределами видимости приложения.

Функция getsockopt возвращает значение параметра. Кроме вышеперечисленных параметров, функция getsockopt может использовать следующие параметры:

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

Княжий человек

Билик Дмитрий Александрович
3. Бедовый
Фантастика:
юмористическая фантастика
городское фэнтези
мистика
5.00
рейтинг книги
Княжий человек

Отмороженный 6.0

Гарцевич Евгений Александрович
6. Отмороженный
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Отмороженный 6.0

Жатва душ. Остров мертвых

Сугралинов Данияр
Фантастика:
боевая фантастика
рпг
5.20
рейтинг книги
Жатва душ. Остров мертвых

Имперец. Земли Итреи

Игнатов Михаил Павлович
11. Путь
Фантастика:
героическая фантастика
боевая фантастика
5.25
рейтинг книги
Имперец. Земли Итреи

Стражи душ

Кас Маркус
4. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Стражи душ

Тепла хватит на всех

Котов Сергей
1. Миры Пентакля
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Тепла хватит на всех

Возвращение демонического мастера. Книга 1

Findroid
1. Вселенная Вечности
Фантастика:
фэнтези
5.75
рейтинг книги
Возвращение демонического мастера. Книга 1

На границе империй. Том 4

INDIGO
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
На границе империй. Том 4

Кодекс Крови. Книга ХVI

Борзых М.
16. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVI

Я сделаю это сама

Кальк Салма
1. Магический XVIII век
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Я сделаю это сама

Я граф. Книга XII

Дрейк Сириус
12. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я граф. Книга XII

Неудержимый. Книга VI

Боярский Андрей
6. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга VI

Как я строил магическую империю 3

Зубов Константин
3. Как я строил магическую империю
Фантастика:
попаданцы
постапокалипсис
аниме
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 3

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый