int sockatmark(int sockfd);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
sockatmark(): _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600
帯域外データは、いくつかのストリームソケットプロトコルでしか サポートされていない。
sockatmark() は SIGURG シグナルのハンドラから安全に呼び出すことができる。
sockatmark() は SIOCATMARK ioctl(2) 操作を使って実装されている。
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) <= 0);
if (s == -1)
perror("read");
if (s <= 0)
break;
}
if (atmark == 1) {
if (recv(sockfd, &oobdata, 1, MSG_OOB) == -1) {
perror("recv");
...
}
}