C sendfile()完成到非阻塞套接字

C sendfile()完成到非阻塞套接字,c,sockets,nonblocking,C,Sockets,Nonblocking,在我的程序中,我需要检查非阻塞套接字中sendfile()操作的完成情况。如何做到这一点 查看文档并在internet上搜索后,我找不到如何执行此操作它的工作原理与send()非常相似:如果套接字设置为O_NONBLOCK,并且操作将被阻止,sendfile()立即返回并将errno设置为EAGAIN。在这种情况下,您必须等待一段时间,然后再试一次(可能使用类似于select()的函数来知道它何时准备就绪) 还要记住,即使成功,它也可能不会在单个函数调用中写入您请求的所有字节。始终检查返回值:

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


查看文档并在internet上搜索后,我找不到如何执行此操作

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

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

如果传输成功,则写入out_fd的字节数为 返回。在出现错误时,返回-1,并正确设置errno


您还可以查看

以稍微展开:如果
sendfile()
返回的值大于0,那么现在已经成功发送了那么多字节-无需等待完成。“非阻塞”并不意味着“异步”。只需确认:当当前块被刷新时,select()会将套接字报告为可写(FD_ISSET()==true)。然后,您需要再次调用sendfile(),但要保留一个新的偏移量。@caf:当输入文件描述符阻塞时会发生什么情况?@KerrekSB:在大多数情况下,这一点是没有意义的,因为输入文件描述符将是一个无法阻塞的磁盘文件。唯一的另一种情况是使用块或字符设备节点,它支持
mmap
和块操作,这将是一种非常不寻常的组合(直接从设备节点发送
sendfile()
是不寻常的)。不过在这种情况下,我相信
sendfile()
会等待输入数据,就像进程映射了设备并在映射过程中出现了一个小错误一样。@caf:我知道现在可以将两个文件描述符都设为套接字,所以我正在考虑一个简洁、廉价的echo服务器实现。但不管是什么原因,我就是找不到任何文档来说明
sendfile
在没有、一个或两个FD都是非阻塞的情况下的精确行为。触发了谁的边缘?