WEB开发网
开发学院软件开发VC WinSock学习笔记(2) 阅读

WinSock学习笔记(2)

 2010-05-25 20:36:41 来源:WEB开发网   
核心提示:4、WSAEventSelect模型WSAEventSelect模型类似WSAAsynSelect模型,但最主要的区别是网络事件发生时会被发送到一个事件对象句柄,WinSock学习笔记(2)(5),而不是发送到一个窗口,使用步骤如下:a、创建事件对象来接收网络事件:#define WSAEVENT HANDLE#def

4、WSAEventSelect模型

WSAEventSelect模型类似WSAAsynSelect模型,但最主要的区别是网络事件发生时会被发送到一个事件对象句柄,而不是发送到一个窗口。

使用步骤如下:

a、创建事件对象来接收网络事件:

#define WSAEVENT HANDLE
#define LPWSAEVENT LPHANDLE
WSAEVENT WSACreateEvent( void );

该函数的返回值为一个事件对象句柄,它具有两种工作状态:已传信(signaled)和未传信

(nonsignaled)以及两种工作模式:人工重设(manual reset)和自动重设(auto reset)。默认未未传信的工作状态和人工重设模式。

b、将事件对象与套接字关联,同时注册事件,使事件对象的工作状态从未传信转变未

已传信。

int WSAEventSelect( SOCKET s,WSAEVENT hEventObject,long lNetworkEvents );

s为套接字

hEventObject为刚才创建的事件对象句柄

lNetworkEvents为掩码,定义如上面所述

c、I/O处理后,设置事件对象为未传信

BOOL WSAResetEvent( WSAEVENT hEvent );

Hevent为事件对象

成功返回TRUE,失败返回FALSE。

d、等待网络事件来触发事件句柄的工作状态:

DWORD WSAWaitForMultipleEvents( DWORD cEvents,
const WSAEVENT FAR * lphEvents, BOOL fWaitAll,
DWORD dwTimeout, BOOL fAlertable );

lpEvent为事件句柄数组的指针

cEvent为为事件句柄的数目,其最大值为WSA_MAXIMUM_WAIT_EVENTS 

fWaitAll指定等待类型:TRUE:当lphEvent数组重所有事件对象同时有信号时返回;

FALSE:任一事件有信号就返回。

dwTimeout为等待超时(毫秒)

fAlertable为指定函数返回时是否执行完成例程

对事件数组中的事件进行引用时,应该用WSAWaitForMultipleEvents的返回值,减去

预声明值WSA_WAIT_EVENT_0,得到具体的引用值。例如:

nIndex=WSAWaitForMultipleEvents(…);
MyEvent=EventArray[Index- WSA_WAIT_EVENT_0];

e、判断网络事件类型:

int WSAEnumNetworkEvents( SOCKET s,
WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents );

s为套接字

hEventObject为需要重设的事件对象

lpNetworkEvents为记录网络事件和错误代码,其结构定义如下:

typedef struct _WSANETWORKEVENTS {
  long lNetworkEvents;
  int iErrorCode[FD_MAX_EVENTS];
} WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS;

f、关闭事件对象句柄:

BOOL WSACloseEvent(WSAEVENT hEvent);

调用成功返回TRUE,否则返回FALSE。

上一页  1 2 3 4 5 

Tags:WinSock 学习 笔记

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接