Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 54 стр.

UptoLike

Составители: 

54
Принятие соединений
Гнездо-сервер может принимать соединение от нескольких клиентов
одновременно. Это гнездо-сервер не становится частью соединения; вместо этого для
каждого соединения создается собственное гнездо.
int accept (int SOCKET, struct sockaddr *ADDR,
socklen_t *LENGTH_PTR
Функция используется для принятия запроса на соединение на гнездо-сервер
SOCKET. Функция ожидает появления запроса на соединение, если очередь запросов
пуста и гнездо не установлено в неблокируемый режим.
Аргументы ADDR и LENGTH-PTR используются для возвращения
информации об имени клиентского гнезда, которое инициируется соединение.
В случае успешного выполнения функция возвращает идентификатор файла
для нового гнезда. В случае ошибки возвращается -1, а переменная errno может
принимать следующие значения:
EBADF SOCKET не является правильным идентификатором файла;
ENOTSOCK SOCKET не является гнездом;
EOPNOTSUPP SOCKET не поддерживает эту операцию;
EWOULDBLOCK SOCKET установлен в неблокируемый режим, а запрашиваемых
соединений в очереди в настоящий момент нет.
Использование функции недопустимо для способов взаимодействия, не
требующих установления соединений.
Идентификация соединений
int getpeername (int SOCKET, struct sockaddr *ADDR,
socklen_t *LENGTH-PTR)
Функция возвращает адрес гнезда, которое пытается подключиться к гнезду
SOCKET. Информация сохраняется в участках памяти, на которые указывают
параметры ADDR и LENGTH-PTR. Функция возвращает 0 в случае успешного
выполнения и -1 в случае неудачи. Переменная errno может принимать следующие
значения:
EBADF SOCKET не является верным дескриптором файла;
ENOTSOCK SOCKET не является гнездом;
ENOTCONN соединение с SOCKET не установлено;
ENOBUFS недостаточно внутренних буферов.
Передача данных
Как только соединение между двумя гнездами установлено, можно
использовать обычные операции read и write для передачи данных. Гнездо является
двусторонним каналом передачи данных, поэтому операции чтения и записи могут
выполняться на обоих концах соединения.
Кроме того, для гнезд имеются несколько дополнительных режимов передачи
данных. Эти режимы можно использовать с помощью функций recv и send.
int send (int SOCKET, void *BUFFER, size_t SIZE, int FLAGS)
Функция send определена в заголовочном файле <sys/socket.h>. Если аргумент
FLAGS установлен в 0, действия функции идентичны write. Если соединение было
установлено, а затем разрушено, в результате выполнения функций send и write
генерируется сигнал SIGPIPE.
Функция возвращает количество считанных байтов или -1 в случае ошибки.
Если гнездо находится в неблокируемом режиме, функция может вернуть только часть
передаваемых данных. Переменная errno может принимать следующие значения:
       Принятие соединений
       Гнездо-сервер может принимать соединение от нескольких клиентов
одновременно. Это гнездо-сервер не становится частью соединения; вместо этого для
каждого соединения создается собственное гнездо.
       int accept (int SOCKET, struct sockaddr *ADDR,
            socklen_t *LENGTH_PTR
        Функция используется для принятия запроса на соединение на гнездо-сервер
SOCKET. Функция ожидает появления запроса на соединение, если очередь запросов
пуста и гнездо не установлено в неблокируемый режим.
        Аргументы ADDR и LENGTH-PTR используются для возвращения
информации об имени клиентского гнезда, которое инициируется соединение.
        В случае успешного выполнения функция возвращает идентификатор файла
для нового гнезда. В случае ошибки возвращается -1, а переменная errno может
принимать следующие значения:
EBADF                  SOCKET не является правильным идентификатором файла;
ENOTSOCK               SOCKET не является гнездом;
EOPNOTSUPP             SOCKET не поддерживает эту операцию;
EWOULDBLOCK            SOCKET установлен в неблокируемый режим, а запрашиваемых
                       соединений в очереди в настоящий момент нет.
        Использование функции недопустимо для способов взаимодействия, не
требующих установления соединений.

       Идентификация соединений
       int getpeername (int SOCKET, struct sockaddr *ADDR,
            socklen_t *LENGTH-PTR)
       Функция возвращает адрес гнезда, которое пытается подключиться к гнезду
SOCKET. Информация сохраняется в участках памяти, на которые указывают
параметры ADDR и LENGTH-PTR. Функция возвращает 0 в случае успешного
выполнения и -1 в случае неудачи. Переменная errno может принимать следующие
значения:
EBADF              SOCKET не является верным дескриптором файла;
ENOTSOCK           SOCKET не является гнездом;
ENOTCONN           соединение с SOCKET не установлено;
ENOBUFS            недостаточно внутренних буферов.

       Передача данных
       Как только соединение между двумя гнездами установлено, можно
использовать обычные операции read и write для передачи данных. Гнездо является
двусторонним каналом передачи данных, поэтому операции чтения и записи могут
выполняться на обоих концах соединения.
       Кроме того, для гнезд имеются несколько дополнительных режимов передачи
данных. Эти режимы можно использовать с помощью функций recv и send.
       int send (int SOCKET, void *BUFFER, size_t SIZE, int FLAGS)
       Функция send определена в заголовочном файле . Если аргумент
FLAGS установлен в 0, действия функции идентичны write. Если соединение было
установлено, а затем разрушено, в результате выполнения функций send и write
генерируется сигнал SIGPIPE.
       Функция возвращает количество считанных байтов или -1 в случае ошибки.
Если гнездо находится в неблокируемом режиме, функция может вернуть только часть
передаваемых данных. Переменная errno может принимать следующие значения:


       54