使用 Winsock 核心函式與事件回呼函式
針對特定通訊端作業,Winsock Kernel (WSK) 應用程式可以呼叫其中一個通訊端的 WSK 函式來執行作業,或在 WSK 子系統在與作業相關聯的 事件發生 時,在通訊端上啟用事件回呼函式。 例如,在連線導向通訊端上接收資料時,WSK 應用程式可以呼叫通訊端的 WskReceive 函式,或在通訊端上實作及啟用 WskReceiveEvent 事件回呼函式。 WSK 應用程式的需求會指示應用程式應該使用的方法。 如需如何使用這兩種方法的範例,請參閱 WSK 檔。
下列清單摘要說明每個方法的一些重點。
使用 Winsock 核心函式
WSK 應用程式會驅動通訊端作業,這表示 WSK 應用程式會在通訊端作業發生時控制。 這可能會簡化 WSK 應用程式所需的同步處理。
WSK 應用程式會將 IRP 提供給通訊端函式。 這些 IRP 會由 WSK 子系統排入佇列,直到通訊端作業完成為止。 如需搭配 WSK 函式使用 IRP 的詳細資訊,請參閱 搭配 Winsock 核心函式使用 IRP。
WSK 應用程式可以等候 IRP 讓 WSK 子系統完成每個作業,來執行封鎖通訊端作業。
WSK 應用程式在某些情況下可能需要讓多個通訊端作業排入佇列,以確保連線導向通訊端上的高效能資料傳輸、防止在資料包通訊端上卸載傳入資料包,或防止接聽通訊端上的連入連線中斷。
WSK 應用程式會提供資料傳輸作業的資料緩衝區。 這可減少可能需要複製資料的次數。 不過,如果 WSK 應用程式將多個資料傳輸作業保留在佇列中,應用程式必須將資料緩衝區提供給每個佇列資料傳輸作業的 WSK 子系統。 因此,WSK 應用程式可能需要額外的記憶體資源。
使用事件回呼函式
WSK 子系統會驅動通訊端作業,這表示 WSK 子系統會藉由呼叫通訊端的事件回呼函式,通知通訊端事件的 WSK 應用程式。 WSK 應用程式可能需要更複雜的同步處理,才能處理事件回呼函式的非同步本質。
WSK 應用程式不會對通訊端作業使用 IRP。
WSK 應用程式不需要佇列通訊端作業。 WSK 子系統會在發生通訊端的事件時,立即呼叫 WSK 應用程式的事件回呼函式。 如果 WSK 應用程式可以跟上呼叫通訊端事件回呼函式的速率,則使用事件回呼函式可提供最高效能,以及卸載資料包或連入連線的最小機率。
WSK 子系統會提供資料傳輸作業的資料緩衝區。 WSK 應用程式必須立即或合理地將這些資料緩衝區釋放回 WSK 子系統,如此一來,WSK 子系統就不會用盡記憶體資源。 因此,WSK 應用程式可能需要將資料從 WSK 子系統所擁有的資料緩衝區複製到它自己的資料緩衝區。
注意 上述清單不一定詳盡。 選擇哪一種方法是特定 WSK 應用程式的最佳選擇時,可能會考慮其他幾點。