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, в случае ошибки. Следует отметить, что нулевое значение не является ошибкой. Оно сигнализирует об отсутствии данных, записанных в сокет процессом-поставщиком.



2004-06-22