社区
网络编程
帖子详情
求助:WSAEventSelect封装的问题,
samzw
2007-03-15 05:07:15
我封装了一个类似CAsyncSocket的类,使用WSAEventSelect,调度线程在第一次Create Socket时候产生,然后在线程函数里回调消息处理函数,奇怪的是:在VC环境里面运行,程序一切正常,如果在单独运行程序,程序完成连接后,后面的事件就不触发,不知道为什么?谁知道说说看?
...全文
234
11
打赏
收藏
求助:WSAEventSelect封装的问题,
我封装了一个类似CAsyncSocket的类,使用WSAEventSelect,调度线程在第一次Create Socket时候产生,然后在线程函数里回调消息处理函数,奇怪的是:在VC环境里面运行,程序一切正常,如果在单独运行程序,程序完成连接后,后面的事件就不触发,不知道为什么?谁知道说说看?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
samzw
2007-03-16
打赏
举报
回复
线程里的代码大致是这样的,CAsyncSocket是我封装的类名,暂时取成这样,:)请anjuta_c(天天学习不退步)帮看看
samzw
2007-03-16
打赏
举报
回复
pSocket->m_bThreadStarted = TRUE;
while (TRUE)
{
//EnterCriticalSection(&CAsyncSocket::m_cs);
nIndex = WSAWaitForMultipleEvents(CAsyncSocket::m_totalSocket,CAsyncSocket::eventArrray,FALSE,timeout,FALSE);
//LeaveCriticalSection(&CAsyncSocket::m_cs);
if (pSocket->m_bEndTread)
{
_endthread();
}
if(nIndex == WSA_WAIT_FAILED || nIndex == WSA_WAIT_TIMEOUT)
{
continue;
}
nIndex = nIndex - WSA_WAIT_EVENT_0;
//WSAEnumNetworkEvents(socketArray[Index-WSA_WAIT_EVENT_0],eventArray[Index-WSA_WAIT_EVENT_0],
CAsyncSocket::m_dwIndex = nIndex;
//EnterCriticalSection(&CAsyncSocket::m_cs);
nIndex = ::WSAWaitForMultipleEvents(1,&CAsyncSocket::eventArrray[nIndex],TRUE,1000,FALSE);
//LeaveCriticalSection(&CAsyncSocket::m_cs);
CAppLog::LogMessage(__FILE__,__LINE__,0,"event");
if(nIndex == WSA_WAIT_FAILED || nIndex == WSA_WAIT_TIMEOUT)
{
continue;
}else
{
memset(&tEvent,0,sizeof(WSANETWORKEVENTS));
//EnterCriticalSection(&CAsyncSocket::m_cs);
::WSAEnumNetworkEvents(CAsyncSocket::socketArray[nIndex],CAsyncSocket::eventArrray[nIndex],&tEvent);
//WSAResetEvent(CAsyncSocket::eventArrray[i]);
//LeaveCriticalSection(&CAsyncSocket::m_cs);
if (tEvent.lNetworkEvents & FD_CONNECT)
{
errorcode = tEvent.iErrorCode[FD_CONNECT_BIT];
pSocket->OnConnect(errorcode);
if(errorcode != 0)
break;
}
else if (tEvent.lNetworkEvents & FD_ACCEPT)
{
errorcode = tEvent.iErrorCode[FD_ACCEPT_BIT];
pSocket->OnAccept(errorcode);
if(errorcode != 0)
break;
}//fd_read
else if (tEvent.lNetworkEvents & FD_READ)
{
DWORD nBytes = 0;
errorcode = tEvent.iErrorCode[FD_READ_BIT];
if(errorcode !=0 )
break;
ioctlsocket(CAsyncSocket::socketArray[nIndex],FIONREAD,&nBytes);
if (nBytes > 0)
pSocket->OnReceive(errorcode);
}
else if (tEvent.lNetworkEvents & FD_WRITE)
{
errorcode = tEvent.iErrorCode[FD_WRITE_BIT];
pSocket->OnSend(errorcode);
if(errorcode != 0)
break;
}
else if (tEvent.lNetworkEvents & FD_CLOSE)
{
errorcode = tEvent.iErrorCode[FD_CLOSE_BIT];
pSocket->OnClose(errorcode);
CAsyncSocket::RemoveSocket(CAsyncSocket::socketArray[nIndex]);
if(errorcode != 0)
break;
}
}
}
anjuta_c
2007-03-16
打赏
举报
回复
代码贴上来
samzw
2007-03-16
打赏
举报
回复
不是,就只有一个事件收到FD_CONNECT,其他事件就没了..
skywoodsky
2007-03-16
打赏
举报
回复
是不是fd_read的事件比fd_connect 先到了,有时候会出现这种情况的
samzw
2007-03-16
打赏
举报
回复
anjuta_c(天天学习不退步) 按照你的意思改过了,WSAResetEvent也都去掉了,情况还是象上面一样.郁闷...
anjuta_c
2007-03-15
打赏
举报
回复
我估计可能使你FD_CONNECT事件过后,你没有将你用WSACreateEvent创建的事件对象恢复为“无信号”。
你是怎么调用WSAEnumNetworkEvents 函数的?建议你调用这个函数的时候,为函数的第2个参数加上 socket句柄对应的event object句柄。另外程序中如果有WSAResetEvent函数调用,全部注释掉!
samzw
2007-03-15
打赏
举报
回复
没有从WSAWaitForMultiObjects返回,连接成功只有一个事件FD_CONNECT返回,服务器应该在返回一个欢迎的消息,也就是说应该在接受到一个FD_READ事件,实际没有接受到这个事件
anjuta_c
2007-03-15
打赏
举报
回复
从WSAWaitForMultiObjects函数返回了吗?
samzw
2007-03-15
打赏
举报
回复
日志已经加上了,"如果在单独运行程序,程序完成连接后,后面的事件就不触发",这也是看日志才看出来的
anjuta_c
2007-03-15
打赏
举报
回复
加上日志,看看代码在哪一点上异常了。
或者做一个cui程序,脱离vc直接输出一下,看看在那里执行不正确了
W
SAE
vent
Select
**标题:W
SAE
vent
Select
** **一、W
SAE
vent
Select
介绍** `W
SAE
vent
Select
`是Windows Socket API中一个核心的函数,它主要用于在多路复用I/O模型中注册网络事件,允许开发者以异步的方式处理套接字操作。在Windows...
W
SAE
vent
Select
Console服务器端
**标题解析:** "W
SAE
vent
Select
Console服务器端" 是一个使用了W
SAE
vent
Select
函数的控制台应用程序,它的设计目标是实现服务器端的功能。W
SAE
vent
Select
是Windows Socket API中的一部分,它允许应用程序通过事件...
w
saE
vent
Select
事件选择模型
**w
saE
vent
Select
事件选择模型详解** 在计算机网络编程中,特别是在Windows系统下进行低级套接字编程时,`w
saE
vent
Select
`是一个至关重要的API函数。它提供了基于事件的I/O模型,使得开发者可以处理多个套接字的...
W
SAE
vent
Select
模型基础 VS2010 、C
**W
SAE
vent
Select
模型基础** 在Windows Socket编程中,`W
SAE
vent
Select
`是一个关键的API函数,它允许程序员将套接字与Windows事件对象关联起来。这种模型为多路复用I/O提供了基础,使得应用程序可以等待多个网络...
W
SAE
vent
Select
模型
W
SAE
vent
Select
模型
网络编程
18,363
社区成员
64,187
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章