ВУЗ:
Составители:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 52
- 53
- 54
- 55
- 56
- …
- следующая ›
- последняя »