2011-01-13 59 views

回答

3

要進行手動零拷貝傳輸,您需要以重疊模式打開套接字和文件,並將它們與IO完成端口相關聯。然後,您對該文件執行讀操作,當文件讀取完成時,將填充的緩衝區傳遞給套接字上的寫操作。然後,您可以通過調整套接字上的發送緩衝區大小來調整此設置,以防止複製並在打開文件時選擇正確的標誌。

請注意,您應該使用後續的套接字寫入完成來驅動您的文件讀取。也就是說,當舊堆棧完成時,不要繼續發出新讀,因爲TCP堆棧可能最終會由於TCP窗口變滿而進行流量控制,並且此時您將使用非分頁池作爲套接字寫入花費的時間越來越長(詳情請參閱here)。因此,決定每個連接允許的優秀套接字寫入數量,並在達到該數字時限制讀取次數,即從讀取完成時的讀取切換到寫入完成時的讀取次數...

請注意,並不像使用TransmitFile()本身那樣有效,因爲它避免了發生內核到用戶轉換以通知讀取完成併發出寫入調用。

回答問題的第一部分,如果您嘗試,會發生什麼情況?