sockatmark -
どのソケットに帯域外
(out-of-band)
マークが付けられているかを調べる
#include <sys/socket.h>
int sockatmark(int sockfd);
sockatmark(): _POSIX_C_SOURCE >= 200112L
sockatmark()
はファイルディスクリプター
sockfd
で参照されるソケットに帯域外マークが付けられているか否かを返す。
ソケットにマークが付けられている場合は、1
が返される。
ソケットにマークが付けられていない場合は、0
が返される。
この関数は帯域外マークを削除しない。
sockatmark()
の呼び出しが成功した場合、ソケットに帯域外マークが
付けられていれば 1
を返し、付けられていなければ
0 を返す。
エラーの場合は -1
が返され、エラーを表す
errno が設定される。
- EBADF
-
sockfd
が有効なファイルディスクリプターでない。
- EINVAL
-
sockfd は sockatmark()
が適用できないファイルディスクリプターである。
sockatmark() は glibc バージョン
2.2.4 で追加された。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
sockatmark() |
Thread safety |
MT-Safe |
POSIX.1-2001, POSIX.1-2008.
sockatmark() が 1
を返す場合、帯域外データは
MSG_OOB を指定した
recv(2)
で読み込むことができる。
帯域外データは、いくつかのストリームソケットプロトコルでしか
サポートされていない。
sockatmark() は
SIGURG
シグナルのハンドラーから安全に呼び出すことができる。
sockatmark() は
SIOCATMARK ioctl(2)
操作を使って実装されている。
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)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。