2009-12-20 144 views
2

在我的程序中,我需要检查一个非阻塞套接字中的sendfile()操作的完成情况。如何做到这一点?sendfile()完成到非阻塞套接字

检查文档和互联网上搜索后,我找不到了怎么办呢

回答

6

它的工作原理非常相似send():如果套接字设置为O_NONBLOCK和操作会阻塞,立即返回sendfile()并将errno设置为EAGAIN。在这种情况下,你必须等待一段时间然后再试一次(也许使用像select()这样的函数来知道它准备好的时间)。

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

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

您还可以看看man page for sendfile()

+2

略微膨胀:如果'的sendfile()'返回一个值> 0,那么多少个字节现在已经成功发送 - 有没有必要等待完成。 “非阻塞”并不意味着“异步”。 – caf 2009-12-20 21:09:15

+0

只需确认:当当前块已被刷新时,select()将报告套接字为可写(FD_ISSET()== true)。然后你需要再次调用sendfile(),但保留一个新的偏移量。 – Leolo 2010-12-15 16:47:50

+0

@caf:当* input *文件描述符被阻塞时会发生什么? – 2013-09-10 20:03:16