使用 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 应用程序的最佳选择时,可能需要考虑其他几点。