WSAWaitForMultipleEvents,等待的多个SOCKET使用FALSE时,只返回一个,如果一个事件对象总有网络事件发生,会令后面的网络事件的不到处理,这个好理解,可是解决方法却是这样: WSAEVENT ev = ::WSACreateEvnet();
::WSAEventSelect(sListen, ev, FD_ACCEPT| FD_CLOSE);
eventArr[nT] = ev;
sockArr[nT] = sListen; while(1){
int index = ::WSAWaitForMultipleEvents(nT, eventArr, FALSE, WSA_INFINITE, 0);
index = index - WSA_WAIT_EVENT_0;
for (int i=index; i<nT; i++){
index = ::WSAWaitForMultipleEvents(1, eventArr[i], FALSE, 1000, 0);
if (index == timeout)//....
continue;
else{
WSANETWORKEVENT event;
WSAEnuNetWorkEvents(sockArr[i], eventArr[i], &event);
if (FD_ACCEPT)....//添加nT,,,
if (FD_READ)....
.....
}
}//end for
}//end while不明白的是对第一个有网络事件为什么要调用FOR()的语句,不会出现问题吗?
第一次WAIT到后,在区WAIT一次,应该WAIT不到把,此事件如果是人工重置,怎么看不到重置的代码?
::WSAEventSelect(sListen, ev, FD_ACCEPT| FD_CLOSE);
eventArr[nT] = ev;
sockArr[nT] = sListen; while(1){
int index = ::WSAWaitForMultipleEvents(nT, eventArr, FALSE, WSA_INFINITE, 0);
index = index - WSA_WAIT_EVENT_0;
for (int i=index; i<nT; i++){
index = ::WSAWaitForMultipleEvents(1, eventArr[i], FALSE, 1000, 0);
if (index == timeout)//....
continue;
else{
WSANETWORKEVENT event;
WSAEnuNetWorkEvents(sockArr[i], eventArr[i], &event);
if (FD_ACCEPT)....//添加nT,,,
if (FD_READ)....
.....
}
}//end for
}//end while不明白的是对第一个有网络事件为什么要调用FOR()的语句,不会出现问题吗?
第一次WAIT到后,在区WAIT一次,应该WAIT不到把,此事件如果是人工重置,怎么看不到重置的代码?
解决方案 »
- 在64bits电脑上编译32bits程序,安装在32bits的WIN7上提示不兼容?
- 请教三维坐标变换
- 如何遍历文件夹中所有的文件夹和文件
- 应该是最简单的问题了,但我不懂,虚心请教
- 自己找不出错了(CFileDialog 得到多个不含路径文件名 并输出在ListCtrl中)
- 一个简单问题:从文件中读取内容,参数用什么类型?
- **<重复问一次> 子窗口收不到 按键消息, 怎么解决??? ***
- 那位高人知道哪有用纯Win32API对SQL Server、oracle编程的资料啊?(感激!)
- C++好难学!!!!!!!!!!!!!!!
- 怎么才能释放GlobalLock申请的内存空间?
- int byte 类的数据怎么转变成为 LPCWSTR ?
- 100分请教一个简单程序的崩溃问题(附源码,演示录像及说明)
这招可以解决后面等不到处理的问题,
2,重置发生在EnumNewWorkEvents里面