使用 Winsock 内核函数与事件回调函数
对于某些套接字操作,Winsock 内核 (WSK) 应用程序可以调用套接字的 WSK 函数之一来执行该操作,或者在与操作关联的事件发生时在 WSK 子系统调用的套接字上实现和启用 事件 回调函数。 例如,在面向连接的套接字上接收数据时,WSK 应用程序可以调用套接字的 WskReceive 函数,或在套接字上实现并启用 WskReceiveEvent 事件回调函数。 WSK 应用程序的要求决定了应用程序应使用哪种方法。 WSK 文档中提供了有关如何使用这两种方法的示例。
以下列表汇总了每个方法的一些要点。
使用 Winsock 内核函数
WSK 应用程序驱动套接字操作,这意味着 WSK 应用程序控制套接字操作何时发生。 这可能会简化 WSK 应用程序所需的同步。
WSK 应用程序为套接字函数提供 IRP。 这些 IRP 由 WSK 子系统排队,直到套接字操作完成。 有关将 IRP 与 WSK 函数配合使用的详细信息,请参阅 将 IRP 与 Winsock 内核函数配合使用。
WSK 应用程序可以通过等待 WSK 子系统完成每个操作的 IRP 来执行阻止套接字操作。
在某些情况下,WSK 应用程序可能需要使多个套接字操作保持排队状态,以确保在面向连接的套接字上传输高性能数据,防止传入数据报在数据报套接字上被删除,或防止传入连接在侦听套接字上被删除。
WSK 应用程序为数据传输操作提供数据缓冲区。 这减少了可能需要复制数据的次数。 但是,如果 WSK 应用程序将多个数据传输操作保持排队,则应用程序必须为每个排队数据传输操作的 WSK 子系统提供数据缓冲区。 因此,WSK 应用程序可能需要额外的内存资源。
使用事件回调函数
WSK 子系统驱动套接字操作,这意味着 WSK 子系统通过调用套接字的事件回调函数来通知 WSK 应用程序套接字的事件。 WSK 应用程序可能需要更复杂的同步来处理事件回调函数的异步性质。
WSK 应用程序不使用 IRP 执行套接字操作。
WSK 应用程序不需要对套接字操作进行排队。 一旦套接字的事件发生,WSK 子系统就会调用 WSK 应用程序的事件回调函数。 如果 WSK 应用程序能够跟上调用套接字的事件回调函数的速率,则使用事件回调函数可以提供最高的性能,并且删除数据报或传入连接的可能性最小。
WSK 子系统为数据传输操作提供数据缓冲区。 WSK 应用程序必须立即或在合理的时间内将这些数据缓冲区释放回 WSK 子系统,以便 WSK 子系统不会耗尽内存资源。 因此,WSK 应用程序可能需要将数据从 WSK 子系统拥有的数据缓冲区复制到其自己的数据缓冲区中。
注意 上述列表不一定详尽无遗。 在选择哪种方法是特定 WSK 应用程序的最佳选择时,可能需要考虑其他几点。