Книга: Разработка приложений в среде Linux. Второе издание
17.6.2. Отправка и получение дейтаграмм
17.6.2. Отправка и получение дейтаграмм
Для отправки и получения UDP-пакетов обычно используются четыре системных вызова[141]: send()
, sendto()
, recv()
, recvfrom()
[142].
#include <sys/types.h>
#include <sys/sockets.h>
int send(int s, const void * data, size_t len, int flags);
int sendto(int s, const void * data, size_t len, int flags,
const struct sockaddr * to, socklen_t toLen);
int recv(int s, void * data, size_t maxlen, int flags);
int recvfrom(int s, void * data, size_t maxlen, int flags,
struct sockaddr * from, socklen_t * fromLen);
Здесь во всех случаях параметр flags
всегда равен нулю. В других ситуациях он может принимать множество значений, они подробно рассматриваются в [33].
Первый из названных вызовов send()
может применяться только для тех сокетов, для которых IP-адрес назначения и порт устанавливались через вызов connect()
. Он посылает первые len
байтов, на которые указывает data
, на другой конец сокета s. Данные передаются как единая дейтаграмма. Если параметр len
задает слишком большое количество данных для передачи в одной дейтаграмме, то в переменной errno
возвращается значение EMSGSIZE
.
Следующий системный вызов sendto()
работает аналогично send()
, но позволяет указывать IP-адрес и номер порта назначения для неподключенных сокетов. Последние два параметра являются указателями на адрес сокета и длину адреса сокета. Применение этой функции не устанавливает адрес назначения для сокета; он остается неподключенным. Последующие вызовы sendto()
могут передавать дейтаграммы в другие пункты назначения. Если аргумент to равен NULL
, то функция sendto()
ведет себя точно также как и send()
.
Системные вызовы recv()
и recvfrom()
подобны send()
и sendto()
, но они получают дейтаграммы, а не отправляют их. Оба вызова записывают одну дейтаграмму в data
(не более чем *maxlen
байт) и отбрасывают некоторую часть дейтаграммы, которая не помещается в буфер. Удаленный адрес, отправивший дейтаграмму, сохраняется в параметре from
функции recvmsg()
, если только его длина не превышает fromLen
байт.
- 17.6. Использование дейтаграмм UDP
- Получение сообщений об изменении транспортной MTU
- Получение статистики
- Получение помощи
- Получение помощи по работе с книгой и компакт-диском
- Получение помощи по Windows SharePoint Services 3.0
- Отправка данных в списки SharePoint по электронной почте
- Получение доменного имени
- 4.8. Получение прав root
- 8.4.2. Только отправка почты
- Получение страниц заполненных нулями
- Создание и отправка сообщений