套接字模型

套接字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模型失败”);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值