网络模型之Event select
开始之前,再来看看流程图。 程序阻塞的主要有两部分,一个是等待数据到来,一个是将数据从内核复制到程序缓冲区。 事件选择模型,其实是在 select 模型的基础上更进一步地做了优化,这次优化把等待数据到来的这部分变成了非阻塞。而这主要是使用 WSAEventSelect 函数完成的,其原型如下: int WSAEventSelect ( SOCKET s, // 套接字 WSAEVENT hEventObject, // 事件对象 long lNetworkEvents // 网络事件 ); 事件选择给每个套接字绑定了一个事件,当发生指定网络事件的时候它会把绑定的事件变为 signaled 状态。 WSAEVENT 其实和之前在 Windows 线程同步中所说的内核对象事件是一样的,只是在这个函数中需要手动重置事件,为了清晰方便,所以弄了个 typedef,并提供了一个 WSACreateEvent 函数来创建手动重置的事件。 WSAEVENT event = WSACreateEvent(); 其实,这个 WSACreateEvent 函数就相当于调用以下语句: CreateEvent(NULL, TRUE, FALSE, NULL); lNetworkEvents 可以指定一些指定的网络事件,我们感兴趣的值如下: FD_READ FD_WRITE FD_ACCEPT FD_CONNECT… Continue Reading 网络模型之Event select