Вход/Регистрация
Linux: Полное руководство
вернуться

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

Шрифт:

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 может использовать следующие параметры:

♦ SO_ERROR — возвращает номер ошибки (будет в возвращаемом значении);

♦ SO_TYPE — возвращает тип сокета.

Рассмотрим небольшой пример работы с опциями сокетов. Мы установим размер буфера TCP.

#include "sock.h"

#include "stdio.h"

main {

 int sd; /* дескриптор сокета */

 int optval; /* значение опции */

 int optlen; /* длина optval */

 int new_buffsize = 8192; /* новый размер буфера */

 /* создаем сокет */

 sd = socket(AF_INET, SOCK_STREAM, 0);

 /* считывание длины буфера TCP */

 optlen = sizeof(optval);

 getsockopt(sd, SOL_SOCKET, SO_SNDBUF, &optval, &optlen);

 printf("Size of send buffer %d\n", optval);

 getsockopt(sd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen);

  • Читать дальше
  • 1
  • ...
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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