套接字I/O模型
1:Select模型
Select模型是一种常见的模型,通过select函数来确定套接字状态。在网络应用程序中,通过一个线程来设计一个循环,不停的调用select函数,判断套接字上是否存在数据或者是否能够向套接字写入数据等
int select(int nfds,fd_set FAR *readfds, fd_set FAR *writefds,fd_set FAR * exceptfds, const struct timeval FAR * timeout)
nfds:无实际意义
readfds表示一组可读套接字
writefds表示一组可写套接字
exceptfds表示一组被检查有错误的套接字
timeout表示函数的等待时间
返回值:如果函数调用成功,在readfds,writefds、exceptfds参数中将存储满足条件的套接字元素,并且函数返回值为满足条件的套接字数量。如果函数调用超出了timeout设置的时间,返回值是0,如果函数调用失败,返回值是SOCKET_ERROR
为了方便用户对fd_set类型的参数进行操作,VC++提供了四个宏
1:FD_CLR(s, *set) :从集合中删除套接字
2:FD_ISSET(s,*set):判断套接字s是否为集合set中的一员,如果是返回值为0,否则为0
3:FD_SET(s,*set):向集合中添加套接字s
4:FD_ZERO(*set):将集合set初始化为null;
下面一段代码判断套接字上是否有数据可读
fd_set fdRead; //定义一个fd_set对象
FD_ZERO(&fdRead); //初始化fdRead
FD_SET(clientSock,&fdRead); //将套接字clientSock添加到fdRead中
if(select(0,&fdRead,NULL,NULL,NULL)>0) //调用select函数
{
If(FD_ISSET(clientSock,&fdRead)//判断clientSock是否是fdRead中一员
{
//从套接字中读取数据
}
}
2:WSAAsyncSelect模型
WSAAsyncSelect模型是WINSOWS系统基于消息的网络事件通知模型。当网络中有事件发生时,利用用户的连续请求,则应用程序中指定的窗口将会接受到一个消息,可以通过处理消息函数对网络中的事件进行处理。
int WSAAsyncSelect(SOCKET s,HWND hwnd,unsigned int wMsg,long lEvent)
Hwnd:表示接收消息的窗口句柄
wMsg表示窗口接受来自套接字中的消息
lEvent表示网络中发生的事
其中对于lEvent事件有
FD_READ :套接字中有数据读取时发送消息
FD_WRITE:当输出缓冲区可用区时发出消息
FD_OOB:套接字中有外带数据读取时发生消息
FD_ACCEPT:有连接请求时发出消息
FD_CONNECT:当连接完成后发出消息
FD_CLOSE:套接字关闭时发出消息
下面通过一段代码描述WSAAsyncSelect模型的使用
1:自定义一个消息
#define WM_SOCKER WM_USER+20
2:添加一个消息处理函数,用于处理网络中的事件
LRESULT CDialogDlg::OnSocket(WPARAM wParam,LPARAM lParam)
{
int nEvent=WSAGETSELECTEVENT(lParam);//读取网络18:40
int nError=WSAGETSELECTERROR(lParam);//读取错误代码
switch(nEvent)
{
case FD_CONNECT:……
case FD_READ :……
……
}
Return 0;
}
3:添加消息映射宏,将自定义消息与消息处理函数关联
ON_MESSAGE(WM_SOCKET,OnSocket)
4:调用WSAAsyncSelect函数套接字模型
int nRet=WSAAsyncSelect(clientSock,m_hWnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CONNECT);
if(nRet!=0)
{
TRACE(“设置WSAAsyncSelect模型失败”);
}