【问题标题】:sendfile() completion to non-blocking socketsendfile() 完成到非阻塞套接字
【发布时间】:2009-12-20 14:49:25
【问题描述】:

在我的程序中,我需要检查非阻塞套接字中的 sendfile() 操作是否完成。怎么办?

查看文档并在互联网上搜索后,我不知道该怎么做

【问题讨论】:

    标签: c sockets nonblocking


    【解决方案1】:

    它的工作原理与send() 非常相似:如果套接字设置为O_NONBLOCK 并且操作将阻塞,sendfile() 立即返回并将errno 设置为EAGAIN。在这种情况下,您必须等待一段时间,然后再试一次(可能使用select() 之类的函数来知道它何时准备就绪)。

    还请记住,即使成功,它也可能不会在单个函数调用中写入您请求的所有字节。始终检查返回值:

    如果传输成功,写入out_fd的字节数为 回来。出错时,返回 -1,并适当设置 errno。

    你也可以看看man page for sendfile()

    【讨论】:

    • 稍微扩展一下:如果sendfile() 返回的值 > 0,那么现在已经成功发送了这么多字节 - 无需等待完成。 “非阻塞”并不意味着“异步”。
    • 只是为了确认:当当前块已被刷新时,select() 将报告套接字为可写的 (FD_ISSET()==true)。然后您需要再次调用 sendfile(),但保留一个新的偏移量。
    • @caf: input 文件描述符阻塞时会发生什么?
    • @KerrekSB:在大多数情况下,这一点没有实际意义,因为输入文件描述符将是一个磁盘文件,不能阻塞。唯一的另一种情况是使用同时支持mmap 和阻塞操作的块或字符设备节点,这将是一个非常不寻常的组合(而且直接来自设备节点的sendfile() 是不寻常的)。不过在这种情况下,我相信sendfile() 会等待输入数据,就像进程已经映射了设备并在映射上发生了小错误一样。
    • @caf:我知道你现在可以让两个文件描述符都是套接字,所以我在考虑一个简洁的'n'cheap 回显服务器实现。但不管原因,我只是找不到任何文档来说明sendfile 在没有一个、一个或两个 FD 为非阻塞时的精确行为。谁的边缘被触发了?
    猜你喜欢
    • 1970-01-01
    • 2010-10-31
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多