社区
网络编程
帖子详情
求助:WSAEventSelect封装的问题,
samzw
2007-03-15 05:07:15
我封装了一个类似CAsyncSocket的类,使用WSAEventSelect,调度线程在第一次Create Socket时候产生,然后在线程函数里回调消息处理函数,奇怪的是:在VC环境里面运行,程序一切正常,如果在单独运行程序,程序完成连接后,后面的事件就不触发,不知道为什么?谁知道说说看?
...全文
233
11
打赏
收藏
求助:WSAEventSelect封装的问题,
我封装了一个类似CAsyncSocket的类,使用WSAEventSelect,调度线程在第一次Create Socket时候产生,然后在线程函数里回调消息处理函数,奇怪的是:在VC环境里面运行,程序一切正常,如果在单独运行程序,程序完成连接后,后面的事件就不触发,不知道为什么?谁知道说说看?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
模型
w
saE
vent
Select
事件选择模型
w
saE
vent
Select
实现p2p的文件传输
Winsock W
SAE
vent
Select
(单线程) 服务端模型源码
Winsock W
SAE
vent
Select
服务端模型源码
W
SAE
vent
Select
多线程服务器
由于王艳平老师的代码用纯C实现 全局函数太多 阅读难以理解 本人使用C++重写 思路清晰注释到位 特点: 1 使用多线程 目的是监控连接数量和线程数目 2 界面基于对话框 使用WSAAsync
Select
和W
SAE
vent
Select
两个模型 这是因为使用了界面 前者对消息开放 后者完成网络服务 3 有文档 有测试程序 4 代码只有200多行 比书上少了100行 容易阅读多了 三个类SockectOjb ThreadOjb ThreadPool ">由于王艳平老师的代码用纯C实现 全局函数太多 阅读难以理解 本人使用C++重写 思路清晰注释到位 特点: 1 使用多线程 目的是监控连接数量和线程数目 2 界面基于对话框 使用WSAAsync
Select
和W
SAE
vent
Select
两个模型 这 [更多]
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章