在网上找了个WSAEventSelect的通信模型, 下面有些代码小弟看不懂, 请老手指教:
Index = WSAWaitForMultipleEvents(EventTotal,EventArray,FALSE,WSA_INFINITE,FALSE);
Index = Index - WSA_WAIT_EVENT_0;// 下面的for循环的意义是什么? 上面函数返回的index不就是发生网络事件的对象的索引了吗, 为什么不直接跳到
WSAEnumNetworkEvents 函数呢???
for(i = Index;i < EventTotal;i++)
{
Index = WSAWaitForMultipleEvents(1,&EventArray[i],TRUE,1000,FALSE);
if((Index == WSA_WAIT_FAILED) || (Index == WSA_WAIT_TIMEOUT))
continue;
else
{
Index = i;
WSAEnumNetworkEvents(sockAcceptArray[Index], EventArray[Index],&NetworkEvents);
.... ....
另外,看资料说等待的事件只能有64个, 再除开一些FD_READ,FD_WRITE,那么FD_ACCEPT事件只能少于64个, 是否意味着同时只能有少于64个的客户端连接服务器???
Index = WSAWaitForMultipleEvents(EventTotal,EventArray,FALSE,WSA_INFINITE,FALSE);
Index = Index - WSA_WAIT_EVENT_0;// 下面的for循环的意义是什么? 上面函数返回的index不就是发生网络事件的对象的索引了吗, 为什么不直接跳到
WSAEnumNetworkEvents 函数呢???
for(i = Index;i < EventTotal;i++)
{
Index = WSAWaitForMultipleEvents(1,&EventArray[i],TRUE,1000,FALSE);
if((Index == WSA_WAIT_FAILED) || (Index == WSA_WAIT_TIMEOUT))
continue;
else
{
Index = i;
WSAEnumNetworkEvents(sockAcceptArray[Index], EventArray[Index],&NetworkEvents);
.... ....
另外,看资料说等待的事件只能有64个, 再除开一些FD_READ,FD_WRITE,那么FD_ACCEPT事件只能少于64个, 是否意味着同时只能有少于64个的客户端连接服务器???
解决方案 »
- vc6.0如何使用unicode字符集?
- 使用vc的class wizard派生父类为crecordset类时出现的错误
- 有关主进程和子进程之间传递数据的问题
- MFC中调用含WCHAR字符串出错的问题.mbstowcs 和MultiByteWideChar转换时都是只转了第一个字符的问题.
- 菜鸟问题!
- 为什么这个预编译通不过 _WIN32_WINNT>=00400
- 请问哪儿有 VC技术内幕 第四版 下载
- 如何设置四个串口进行数据收发
- 基于win32程序的EXE文件可不可以带参数?你基于main一样。大家来看一下,UP有分啦,
- 在Tab Control 容器里添加属性页碰到属性页无法激活的问题
- 如何添加 void CKMCDlg::OnBtnCt() 此类的函数呢?
- 请教:设置对话框大小后如何改变控件大小
假如想让这个模型同时管理不止64个套接字,必须创建额外的工作者线程,以便等待更多的事件对象. 这句和楼上的回答都比较抽象, 能否通俗简单的介绍一下思路? 是不是我要多建几个EventArray ? 而所谓的64的限制, 就是WSAWaitForMultipleEvents函数中第一个参数不能大于64, 是否是这个意思?
1.for内的含义就是循环地枚举64个连接的事件通知(每个只是等待1秒)
2.可以适应几百个连接,但你必须要开多个线程去处理这么多连接,因为每个线程只能最多处理64个连接.例如你要处理300连接,那你至少要开6个线程去处理这么多连接.
上面的for循环,是每次循环等待一个事件,如果事件发生则进行处理,但等待时间1000太长了,无法及时响应。用这种方法可以处理大于64个事件,可以不开多线程,但当连接很多时,为了及时响应还是要考虑用多线程的。
Index = WSAWaitForMultipleEvents(1,&EventArray[i],TRUE,0,FALSE);
如果你只有几百的话,不需要使用iocp,直接用标准select模型,然后在你包含ws_32.h前,定义
#define FDSIZE 1024
#define FD_SETSIZE 1024