SOCKATMARK - Linux手册页

时间:2019-08-20 18:01:21  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2020-06-09

名称

sockatmark-确定套接字是否在带外标记

语法

#包括

int sockatmark(int sockfd);

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

sockatmark():_POSIX_C_SOURCE> = 200112L

说明

sockatmark()返回一个值,该值指示文件描述符sockfd所引用的套接字是否处于带外标记。如果套接字在标记处,则返回1;否则,返回1。如果套接字不在标记处,则返回0。此功能不会删除带外标记。

返回值

如果套接字在带外标记处,则对sockatmark()的成功调用将返回1,否则返回0。发生错误时,将返回-1并将errno设置为指示错误。

错误说明

EBADF
sockfd不是有效的文件描述符。
EINVAL
sockfd不是可以将sockatmark()应用于的文件描述符。

版本

sockatmark()已在版本2.2.4中添加到glibc。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
sockatmark()Thread safetyMT-Safe

遵循规范

POSIX.1-2001,POSIX.1-2008。

备注

如果sockatmark()返回1,则可以使用recv(2)的MSG_OOB标志读取带外数据。

仅某些流套接字协议支持带外数据。

可以从SIGURG信号的处理程序中安全地调用sockatmark()。

sockatmark()是使用SIOCATMARK ioctl(2)操作实现的。

BUGS

在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)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/