WSK是一种内核模式的网络编程接口,通过使用WSK模块,内核软件就可以使用与用户态winsock2相同的概念来进行网络I/O。WSK支持类似的socket操作,包括建立socket,绑定,建立连接和数据传输(发送和接收)等。当然,WSK 的网络编程接口支持winsock2中大部分的socket编程概念,但它是一个完全新的并且不同的接口,具有自己的一些特性,例如,使用IRP进行异步I/O和事件回调提高性能。
1.1.1. 结构框架
WSK Architecture
WSK结构的核心是WSK子系统,它实现了WSK网络编程接口的提供者部分。WSK子系统在它的底层与传输提供者交互,支持不同的传输协议
WSK应用程序加在WSK子系统之上,为进行网络I/O操作,它实现WSK 网络编程接口的客户端部分。WSK子系统可以调用WSK客户端的NPI通知WSK应用程序某种事件发生。
WSK应用程序通过WSK注册函数发现并加在WSK子系统之上。应用程序可以使用注册函数检测到WSK子系统是否可用并且交换分派表。
1.1.2. 四种socket
WSK网络编程接口定义了四种不同的socket类型:基本socket,监听socket,数据报socket以及面向连接的socket。
1、基本socket(Basic Sockets)
基本socket用于设置、获取传输的socket选项或者进行socket控制操作。不能绑定到本地传输端口,不支持传输或接收网络数据;
2、监听socket(Listening Sockets)
用于监听从远程传输地址发起的连接,包含所有基本socket的功能
3、数据报socket(Datagram Sockets)
用于发送和接收数据报,包括基本socket的所有功能
4、面向连接的socket(Connection-oriented Sockets)
用于面向连接的发送和接收数据,包括基本socket的所有功能。
1.1.3. 两种工作方式
对于某些socket操作,WSK应用程序可以通过调用WSK函数进行操作,或者实现并使能事件回调函数。例如:当在一个面向连接的socket接收数据,WSK的应用程序可以直接调用socket的WskReceive函数, 或者实现并使能事件回调函数。
下面介绍两种工作方式的特点:
1、使用WSK函数方式
(1)WSK应用驱动socket操作,表示WSK应用可以决定什么时候socket发生操作,可以简化同步处理
(2)WSK应用为socket函数提供IRP,这些IRP被WSK子系统排队知道socket操作完成
(3)WSK应用可以通过等待IRP阻塞socket操作
(4)为提高面向连接socket传输的性能,避免数据报socket内容的丢失以及避免监听socket丢失连接,WSK应用需要实现多socket操作排队
(5)WSK应用为数据传输操作提供buffer,这就减少了数据拷贝的次数,可能会对内存数据有更高的要求
2、使用事件回调函数
(1)WSK子系统驱动socket操作,WSK子系统通过调用事件回调函数通知WSK应用程序。WSK应用程序在同步时需要更复杂的处理;
(2)WSK应用不使用IRP
(3)WSK应用不需要排队socket操作,WSK子系统会在socket事件发生后尽快调用WSK应用的回调函数
(4)WSK子系统支持数据buffer。WSK应用必须自己释放这些数据buffer,因此可能需要内存拷贝操作。