sockatmark -
определяет,
есть ли в
сокете
отметка о
внеполосных
данных
Standard C library (
libc,
-lc)
#include <sys/socket.h>
int sockatmark(int sockfd);
sockatmark():
_POSIX_C_SOURCE >= 200112L
Функция
sockatmark()
возвращает
значение,
показывающее
присутствует
ли в сокете,
на который
ссылается
файловый
дескриптор
sockfd, отметка
о
внеполосных
данных (out-of-band mark).
Если сокет
имеет
отметку, то
возвращается
1; если сокет
не имеет
отметки, то
возвращается
0. Эта
функция не
удаляет
отметку о
внеполосных
данных.
При
успешном
выполнении
sockatmark()
возвращает
1, если сокет
имеет
отметку о
внеполосных
данных, и 0,
если нет.
При ошибке
возвращается
-1, и в
errno
записывается
номер
ошибки.
- EBADF
- Значение
sockfd не
является
правильным
файловым
дескриптором.
- EINVAL
- Значение
sockfd
является
файловым
дескриптором,
к которому
не
применима
функция
sockatmark().
sockatmark() was added in glibc 2.2.4.
Описание
терминов
данного
раздела
смотрите в
attributes(7).
Интерфейс |
Атрибут |
Значение |
sockatmark() |
Безвредность
в нитях |
MT-Safe |
POSIX.1-2001, POSIX.1-2008.
Если
sockatmark()
возвращает
1, то
внеполосные
данные
можно
прочитать
используя
флаг
MSG_OOB в
recv(2).
Внеполосные
данные
поддерживаются
только для
некоторых
потоковых
сокетных
протоколов.
Функцию
sockatmark()
можно
безопасно
вызывать
из
обработчика
сигнала
SIGURG.
Функция
sockatmark()
реализована
с помощью
ioctl(2) с
операцией
SIOCATMARK.
До glibc 2.4,
sockatmark() не
работала.
Следующий
код можно
использовать
после
получения
сигнала
SIGURG
для чтения
(и удаления)
всех
данных до
отметки, и
затем для
чтения
байта
данных
отметки:
char buf[BUF_LEN];
char oobdata;
int atmark, s;
for (;;) {
atmark = sockatmark(sockfd);
if (atmark == -1) {
perror("sockatmark");
break;
}
if (atmark)
break;
s = read(sockfd, buf, BUF_LEN);
if (s == -1)
perror("read");
if (s <= 0)
break;
}
if (atmark == 1) {
if (recv(sockfd, &oobdata, 1, MSG_OOB) == -1) {
perror("recv");
...
}
}
fcntl(2),
recv(2),
send(2),
tcp(7)
Русский
перевод
этой
страницы
руководства
был сделан
Alexander Golubev <
[email protected]>, Azamat Hackimov
<
[email protected]>, Hotellook, Nikita
<
[email protected]>, Spiros Georgaras <
[email protected]>, Vladislav
<
[email protected]>, Yuri Kozlov <
[email protected]>
и Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]