本人期望写一个非阻塞的Server端来解决阻塞模式下accept()占用CPU100%的问题,可是在运用了WSAEventSelect模式,CPU依然占用100%。
不知如何解决这个问题,
请各位大侠帮看下我的代码。 SocketServer = socket(AF_INET,SOCK_STREAM,0); //Server端 socket
ret = bind(SocketServer,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr));
// 主要看以下代码了: 第一次写WSAEventSelect
WSAEVENT AcceptEvent = WSACreateEvent(); // 创建监听事件对象
// 与socket关联,并注册事件类型
ret = WSAEventSelect(SocketServer,AcceptEvent,FD_ACCEPT | FD_CLOSE);
if (ret == SOCKET_ERROR)
{
AfxMessageBox("Server WSAEventSelect Set Errror!");
return 0;
} ret = listen(SocketServer,5); // 设置等待连接,连接最大数为5
if (ret == SOCKET_ERROR)
{
return 0;
}
DWORD index;
_WSANETWORKEVENTS networkEvents;
while (1) // 调试发现在这部不停循环造成CPU100%
{
// 等待网络事件
index = WSAWaitForMultipleEvents(2,&AcceptEvent,FALSE,WSA_INFINITE,FALSE);
// 找出事件类型
WSAEnumNetworkEvents(SocketServer,AcceptEvent,&networkEvents); if (networkEvents.lNetworkEvents & FD_ACCEPT)
{
if (networkEvents.iErrorCode[FD_ACCEPT_BIT] != 0)
{
// 接受连接时间失败
break;
}
SOCKET SocketMSG = accept(SocketServer,NULL,NULL);
if (SocketMSG == INVALID_SOCKET)
{
// accept() Set Error!
AfxMessageBox("accept() Set Error!");
break;
}
if() // 条件满足 Send 自定义消息
}
}对socket编程不甚了解,查找资料写到这一步,
对于我出现的问题,和期望的结果应该如何解决呢?
不知如何解决这个问题,
请各位大侠帮看下我的代码。 SocketServer = socket(AF_INET,SOCK_STREAM,0); //Server端 socket
ret = bind(SocketServer,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr));
// 主要看以下代码了: 第一次写WSAEventSelect
WSAEVENT AcceptEvent = WSACreateEvent(); // 创建监听事件对象
// 与socket关联,并注册事件类型
ret = WSAEventSelect(SocketServer,AcceptEvent,FD_ACCEPT | FD_CLOSE);
if (ret == SOCKET_ERROR)
{
AfxMessageBox("Server WSAEventSelect Set Errror!");
return 0;
} ret = listen(SocketServer,5); // 设置等待连接,连接最大数为5
if (ret == SOCKET_ERROR)
{
return 0;
}
DWORD index;
_WSANETWORKEVENTS networkEvents;
while (1) // 调试发现在这部不停循环造成CPU100%
{
// 等待网络事件
index = WSAWaitForMultipleEvents(2,&AcceptEvent,FALSE,WSA_INFINITE,FALSE);
// 找出事件类型
WSAEnumNetworkEvents(SocketServer,AcceptEvent,&networkEvents); if (networkEvents.lNetworkEvents & FD_ACCEPT)
{
if (networkEvents.iErrorCode[FD_ACCEPT_BIT] != 0)
{
// 接受连接时间失败
break;
}
SOCKET SocketMSG = accept(SocketServer,NULL,NULL);
if (SocketMSG == INVALID_SOCKET)
{
// accept() Set Error!
AfxMessageBox("accept() Set Error!");
break;
}
if() // 条件满足 Send 自定义消息
}
}对socket编程不甚了解,查找资料写到这一步,
对于我出现的问题,和期望的结果应该如何解决呢?
解决方案 »
- ICON风格的List Control问题
- 取消菜单栏
- HMENU hmenu 是什么含义呢?
- 问各位老大一个简单的问题啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 问一个关于CString中的中文字符的问题
- 请达人进来看看我的登陆协议有什么潜在问题
- 我不小心在vc的build->configuration中把release给remove,现在想编译成release版的,怎么办啊?救救我!!
- 启动了一个进程,但该结束的时候不知道怎样终止它,请指教!(在线等待)
- 使用CopyFile将一个小文件从一个盘拷贝到另一个盘,这个文件是立刻被写入磁盘还是先存在缓冲区里?
- 有谁用过VC.net,它比现在的VC6.0有了哪些改进,能不能讲讲,多谢!
- text-to-speech 控制中英文广阅读
- 将CMainFrame类中的OnNCPaint函数重载后,编译运行时,当另外的窗口在上面移动时时产生的轨迹?谢谢
在阻塞模式下,调用accept应该不会出现CPU100%的现象,应该是 你程序其他地方的问题。