求助:WSAEventSelect封装的问题,

samzw 2007-03-15 05:07:15
我封装了一个类似CAsyncSocket的类,使用WSAEventSelect,调度线程在第一次Create Socket时候产生,然后在线程函数里回调消息处理函数,奇怪的是:在VC环境里面运行,程序一切正常,如果在单独运行程序,程序完成连接后,后面的事件就不触发,不知道为什么?谁知道说说看?
...全文
233 11 打赏 收藏 转发到动态 举报
写回复
用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直接输出一下,看看在那里执行不正确了

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧