next up previous contents
Next: Закрытие сокетов. Up: Сокеты. Previous: Соединение сокетов.   Contents

Обмен данными через сокеты.

Для обмена данными существуют две группы функции - для записи в сокет и для чтения из него. Функции для записи имеют вид:

#include <sys/ types. h>

#include <sys/ socket. h>

#include <sys/ uio. h>

int send( int socket, const char *msg, int len, int flags);

int sendto( int socket, const char *msg, int len, int flags,

          const struct sockaddr *to, int tolen );

int sendmsg( int socket, const struct msghdr *msg, int flags );

Аргумент socket определяет дескриптор сокета, в который записываются данные. Аргументы msg и len определяют соответственно, адрес и длину буфера с записываемыми данными. В функции sendmsg() длина данных определяется автоматически по структуре сообщения. Параметр flags содержит комбинацию битовых флагов, управляющих режимами записи. Если аргумент flags равен нулю, то запись в сокет (и, соответственно, считывание) происходит в порядке поступления байтов. Если значение flags определено как MSG_OOB, то записываемые данные передаются потребителю вне очереди. Все функции возвращают число записанных в сокет байтов ( в нормальном случае оно должно быть равно значению параметра len) или -1 в случае ошибки. Отметим, что запись в сокет не означает, что данные приняты на другом конце соединения процессом-потребителем.

Для приема данных процесс-потребитель должен выполнить функцию приема или чтения данных из сокета. Варианты функций приема:

#include <sys/ types. h>

#include <sys/ socket. h>

#include <sys/ uio. h>

int recv( int socket, char *buffer, int len, int flags);

int recvfrom( int socket, char *buffer, int len, int flags,

         const struct sockaddr *from, int fromlen );

int recvmsg( int socket, const struct msghdr *msg, int flags );

Функции чтения и записи в сокет выполняются асинхронно. Первый аргумент функций - это дескриптор сокета, из которого читаются данные. Второй и третий аргументы (buffer и len соответственно) - адрес и длина буфера для записи читаемых данных. Четвертый параметр - это комбинация битовых флагов, управляющих режимами чтения. Если аргумент flags равен нулю, то считанные данные удаляются из сокета. Если значение flags установлено в MSG_PEEK, то данные не удаляются и могут быть считаны последущим вызовом (или вызовами) функций чтения. Функция возвращает число считанных байтов или -1 в случае ошибки. Следует отметить, что нулевое значение не является ошибкой. Оно сигнализирует об отсутствии записанных в сокет процессом-поставщиком данных.



2003-12-09