2009-12-20 145 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