2015-02-24 33 views
0

使用阻塞套接字時,發送文件所需的所有操作都是打開文件並循環訪問並以塊爲單位發送。如何使用IOCP發送文件?

但我發現使用重疊套接字發送文件更具挑戰性。我能想到下面的辦法來做到這一點的:

  1. 我打開該文件併發送第一個塊,我跟蹤 文件句柄和文件位置(我在內存中某個位置存儲這些數據)。
  2. 現在,當我得到一個完成數據包,表明某些數據已發送 ,我檢索文件句柄和文件位置併發送下一個塊。
  3. 我重複步驟2,直到我到達文件中的最後一個塊,然後我關閉文件 。

該方法是否正確?

注意:我不想使用TransmitFile()。


編輯:我已經更新了我的問題。

+0

最簡單的方法:在MSDN上查找'TransmitFile'。 – 2015-02-24 14:58:43

+0

是否有幫助[異步代碼示例](http://www.codeproject.com/Articles/10330/A-simple-IOCP-Server-Client-Class)? – gda2004 2015-04-28 15:47:44

回答

1

如果您不想使用TransmitFile(),那麼您可以使用IOCP的重疊文件I/O,其中文件讀取的完成用於觸發套接字寫入,並且套接字寫入的完成用於觸發文件讀取。然後,您可以決定在傳輸中需要多少數據,併發出多次文件讀取並等待EOF ...

+0

爲什麼downvote?爲什麼不在留言時留下評論,以便我可以改進答案,或者至少可以解釋你認爲是錯誤的。沉默的投票無助於提高答案的質量。 – 2015-04-30 08:01:08

+0

嗨。 2個月前我問過這個問題,你的答案就是這個問題。不過,我最近更新了我的問題,以更詳細地解釋我的意思(如果您還沒有這樣做,請參閱它)。我認爲你的答案是我更新的問題的正確答案,但我不確定你的意思是:「文件讀取的完成」,你是否假設我使用重疊IO從文件中讀取數據? (我沒有downvoted你BTW :-) – John 2015-04-30 15:55:18

+0

是的,你可以使用重疊的I/O來讀取文件和重疊的I/O發送數據到網絡。您可以一次讀取一個讀取內容(對文件執行讀取操作,完成時向網絡寫入數據(使用相同的數據緩衝區),完成後再對該文件執行另一次讀取操作(使用相同的數據緩衝區)儘管使用多個併發讀取效果會更好(但它需要排序以確保在發送時保持文件讀取完成順序正確) - 讀取操作將按順序完成,但如果您有多個線程爲您的線程池提供服務... – 2015-04-30 16:01:49

1

最簡單的方法:在MSDN上查找'TransmitFile'。該功能非常常見(例如,提供網頁),因此它有一個特定的API。