各位大大好,
我的WSAWaitForMultipleEvents當WSA_WAIT_TIMEOUT時會佔用CPU?
要如何解 ?
謝謝各位!
我的WSAWaitForMultipleEvents當WSA_WAIT_TIMEOUT時會佔用CPU?
要如何解 ?
謝謝各位!
解决方案 »
- 如何编程实现建立adsl宽带连接
- ActiveX控件用于Web网页时,奇怪的 _ExtentX 和 _ExtentY 参数
- 急!切换CHtmlView中的网页出现的问题?
- 关于关闭按钮的问题!
- 怎样将BMP格式的文件转换成JPG格式的文件???
- 高分救命:基于CFormView的打印问题应该如何解决?
- *****关于<com原理和应用>的几个问题*****^_^
- 要实现文件关联,用我的程序打开一种类型的文件,除了写注册表外,我的程序中应该写什么代码来打开和读文件?
- 怎么实现给一个软件自动填入账户名和密码 求给个思路
- 初级问题
- 如何在MFC中运用windowsAPI实现录音和播放功能
- 求一个类似des少于8字节加密算法
WSA_WAIT_TIMEOUT不是返回值么
既然函数返回就是释放所属线程了
占用cpu不是正常的么
正常情况下都没有问题,但当server端没有响应后,于WSAWaitForMultipleEvents回应WSA_WAIT_TIMEOUT时,只show出我的最后一次debug讯息,也没有return,CPU即开始上升至90%,该thread就hand住了,,,int SOCKETServer::Receive(char *recv_msg, int time_out)
{
DWORD dwIndex;
int bytesRcvd=0, maxDescriptor=0;
char msg[40];
memset(msg, 0, 40);
EventTotal = 0; try {
hEvent = WSACreateEvent();
} catch (...) {
debuglog(ERR, "Socket WSACreateEvent failed");
ShowWSALastError();
return FAIL;
} if ( hEvent == WSA_INVALID_EVENT ) {
debuglog(ERR, "Socket WSACreateEvent error");
ShowWSALastError();
return FAIL;
}
// WSAEventSelect
try {
rv = WSAEventSelect(clntSock, hEvent, FD_READ);
} catch (...) {
WSAResetEvent(hEvent);
WSACloseEvent(hEvent);
debuglog(ERR, "Socket WSAEventSelect failed");
ShowWSALastError();
return FAIL;
} if ( rv == SOCKET_ERROR ) {
WSAResetEvent(hEvent);
WSACloseEvent(hEvent);
debuglog(ERR, "Socket WSAEventSelect error");
ShowWSALastError();
return FAIL;
} SocketArray[EventTotal] = clntSock;
EventArray[EventTotal] = hEvent;
EventTotal++;
WSANETWORKEVENTS NetworkEvent;
try {
dwIndex = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, (time_out*1000), FALSE);
} catch (...) {
debuglog(ERR, "Socket WSAWaitForMultipleEvents failed");
ShowWSALastError();
WSAResetEvent(hEvent);
WSACloseEvent(hEvent);
return FAIL;
} if ( dwIndex == WSA_WAIT_FAILED ) {
debuglog(ERR, "Socket WSAWaitForMultipleEvents error");
ShowWSALastError();
WSACloseEvent(hEvent);
return FAIL; } else if ( dwIndex == WSA_WAIT_TIMEOUT ) {
debuglog(ERR, "WSAWaitForMultipleEvents timeout !");
WSAResetEvent(hEvent);
WSACloseEvent(hEvent);
Disconnect();
ShowWSALastError(); <<<--- 执行到这
return TIME_OUT; <<<--- 看起来没有return,因为return后的debug讯息没有show出来 } else if ( dwIndex == WAIT_IO_COMPLETION ) {
debuglog(ERR, "WSAWaitForMultipleEvents WAIT_IO_COMPLETION !"); } else {
// do nothing
}
try {
rv = WSAEnumNetworkEvents(SocketArray[dwIndex - WSA_WAIT_EVENT_0], EventArray[dwIndex - WSA_WAIT_EVENT_0], &NetworkEvent);
} catch (...) {
debuglog(ERR, "Socket WSAEnumNetworkEvents failed");
ShowWSALastError();
WSAResetEvent(hEvent);
WSACloseEvent(hEvent);
return FAIL;
} if ( rv == SOCKET_ERROR ) {
debuglog(ERR, "WSAEnumNetworkEvents error !");
ShowWSALastError();
WSAResetEvent(hEvent);
WSACloseEvent(hEvent);
return FAIL;
}
if ( NetworkEvent.lNetworkEvents & FD_READ ) { try {
bytesRcvd = recv(SocketArray[dwIndex - WSA_WAIT_EVENT_0], recv_msg, RCVBUFSIZE, 0);
if ( bytesRcvd == 0 ) {
debuglog(ERR, "Socket connection has been gracefully closed");
ShowWSALastError();
WSAResetEvent(hEvent);
WSACloseEvent(hEvent);
return FAIL; } else if ( bytesRcvd == SOCKET_ERROR ) {
debuglog(ERR, "socket receive error");
ShowWSALastError();
WSAResetEvent(hEvent);
WSACloseEvent(hEvent);
return FAIL; } else if ( bytesRcvd < 0 ) {
debuglog(ERR, "socket receive error ( bytesRcvd<0 )");
ShowWSALastError();
WSAResetEvent(hEvent);
WSACloseEvent(hEvent);
return FAIL; } else {
// data normally receive
}
} catch (...) {
debuglog(ERR, "Socket receive failed");
ShowWSALastError();
WSAResetEvent(hEvent);
WSACloseEvent(hEvent);
return FAIL;
} } //sprintf(msg, "socket receive %d bytes", totalBytesRcvd);
//debuglog(ERROR, msg); //sprintf(msg, "%s recv", CURRENT_TIME_HHMMSSsss); //debugdump(bytesRcvd, (unsigned char *)recv_msg, msg);
WSAResetEvent(hEvent);
WSACloseEvent(hEvent); return bytesRcvd;
}谢谢您 !! ^^