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

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

Жанры

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

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

Шрифт:

// получаем сокет клиента

sock2 = accept(sock1, &client, &ans_len);

// передаем клиенту информацию

write(sock2, MSG_TO_SEND, sizeof(MSG_TO_SEND));

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

Если очередь listen пуста, то наш сервер будет ожидать появления нового

клиента. В случае ошибки функция accept возвращает отрицательное значение.

27.3.4. Функция gethostbyname

Пользователям обычно удобнее указать символьное имя сервера, чем его IP-адрес. Для разрешения имени служит функция gethostbyname. Вот ее прототип:

#include <netinet/in.h>

#include <netdb.h>

struct hostent *gethostbyname(char *name);

Данная функция возвращает указатель на структуру типа hostent, содержащую следующие поля:

♦ char *h_name — доменное имя узла;

♦ char **h_aliases — псевдонимы узла, если таковые определены;

♦ char *h_addr — IP-адрес узла;

♦ int h_addrtype — набор используемых протоколов (в нашем случае — AF_INET);

♦ int h_length — длина адреса узла.

Примеры использования функции:

struct hostent *h;

h = gethostbyname(*argv);

if (h==NULL) {

 printf("Невозможно разрешить имя: `%s`\n", *argv);

 exit(1);

}

// Выводим IP-адрес. Вывод в виде: имя -> адрес

printf("%s -> %s \n", *argv,

inet_ntoa(*((struct in_addr *)h->h_addr_list[0])));

Узнать свой собственный адрес можно с помощью функции getsockname:

extern int getsockname(int __fd, __SOCKADDR_ARG __addr,

 socklen_t *__restrict __len) __THROW;

Ей нужно передать три параметра — дескриптор сокета, адрес структуры, которая будет содержать информацию о нашем узле (его адрес). Третий параметр будет содержать длину адресной структуры.

27.3.5. Функции сетевого ввода/вывода

После успешного установления соединения можно начать обмен данными. Для отправки и получения данных можно использовать обыкновенные функции для работы с файлами — read и write, только вместо дескриптора файла нужно указывать дескриптор сокета. Однако рекомендуется использовать системные вызовы send и recv, которые предназначены

именно для работы с сокетами. Эти системные вызовы будут рассмотрены ниже.

Если вы работаете в режиме без установления соединения, вам нужно использовать функции sendto и recvfrom. Первая функция отправляет данные, а вторая — принимает. Функция sendto вместе с данными позволяет указать адрес получателя, a recvfrom возвращает не только полученные данные, но и адрес отправителя.

Обмен данными в режиме SOCK_STREAM

Для отправления данных используется функция send:

#include <sys/types.h>

#include <sys/socket.h>

extern ssize_t send (int __fd, __const void *__buf,

 size_t __n, int __flags) __THROW;

Первый параметр — дескриптор сокета, второй — указатель на область памяти, которая содержит передаваемые данные. Третий параметр — это размер передаваемых данных в байтах. Последний параметр позволяет определить поведение функции send: если он равен 0, то вызов send полностью аналогичен вызову write.

Нужно отметить особенность работы этой функции; если буфер сокета __fd переполнен, функция переводит программу в состояние ожидания освобождения буфера. Такое может случиться, если узел-приемник по каким-то причинам не успевает принять данные.

Функция возвращает число байтов отправленных данных или -1 в случае ошибки.

Для приема данных используется функция recv:

#include <sys/types.h>

#include <sys/socket.h>

extern ssize_t recv(int __fd, void *__buf, size_t __n,

 int __flags) __THROW;

Первый параметр, как обычно, задает дескриптор сокета. В случае успешного приема данных они будут размешены в буфере __buf — второй параметр функции recv. Третий параметр задает размер области, на которую указывает второй параметр. Если четвертый параметр (флаги) принимает значение 0, то вызов recv аналогичен вызову read. Четвертый параметр может принимать следующие значения:

♦ MSG_PEEK — прочитанные данные не удаляются. Следующий вызов функции recvfrom опять возвратит эти данные.

♦ MSG_WAITALL — процесс будет блокирован до получения всего запрошенного объема данных, а не до получения первого сообщения. Только для сокетов SOCK_STREAM!

Если через указанный сокет ничего нельзя принять, функция переводит программу в состояние ожидания — до появления данных в канале связи.

Функция возвращает количество принятых байтов или -1 в случае ошибки.

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

Метатель. Книга 7

Тарасов Ник
7. Метатель
Фантастика:
боевая фантастика
попаданцы
постапокалипсис
рпг
фэнтези
фантастика: прочее
5.00
рейтинг книги
Метатель. Книга 7

Вернуть Боярство 3

Мамаев Максим
3. Пепел
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Вернуть Боярство 3

Сумеречный Стрелок 3

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

Студиозус

Шмаков Алексей Семенович
3. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Студиозус

Неправильный лекарь. Том 1

Измайлов Сергей
1. Неправильный лекарь
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Неправильный лекарь. Том 1

Черный дембель. Часть 2

Федин Андрей Анатольевич
2. Черный дембель
Фантастика:
попаданцы
альтернативная история
4.25
рейтинг книги
Черный дембель. Часть 2

Развод с генералом драконов

Солт Елена
Фантастика:
фэнтези
5.00
рейтинг книги
Развод с генералом драконов

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

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

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска

Возвышение Меркурия. Книга 15

Кронос Александр
15. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 15

Кодекс Охотника. Книга XXIII

Винокуров Юрий
23. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXIII

Бастард Императора. Том 4

Орлов Андрей Юрьевич
4. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 4

Идеальный мир для Лекаря 16

Сапфир Олег
16. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 16

Своя правда

Шебалин Дмитрий Васильевич
2. Чужие интересы
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Своя правда