OnReceive 在退出服务器后 还要触发多次

时间:2022-06-01 19:12:51

CString strData;
do 
{
CString temp;
pAo->ReadString(temp);
strData += temp;
} while (!pAo->IsBufferEmpty());

这是我从邮件服务器接收数据的函数.
当我 'quit'退出服务器后..CSocket::OnReceive(nErrorCode);还要触发..很多次..

strData 返回的数据都是空...

请问为什么还会触发多次呢..

当我要是把与CSocket关联的CArchive 对象删除掉后...就会出错...因为事件还在触发..还要读取数据..

这究竟是怎么回事?

7 个解决方案

#1


是不是一些FIN包和keepalive之类
建议在里面判断一下temp
那样就不需要返回了

#2


因为这个事件不断的触发... 本来.邮件已经完..退出服务器了..要清理资源...现在这个事件不停的触发...
无法清理资源..等触发了10多次后..就不会再触发了...

#3


退出服务器了,应该调用一下socket的ShutDown()

#4


ShutDown 好像可以解决问题..为什么会这样呢..为什么要调用 ShutDown呢...

#5


因为你断开连接之后,数据队列中如果还存在数据,那些数据仍然会传送到接收数据的socket中,所以OnReceive仍然会响应。但你调用了ShutDown之后 socket就不再接收这些数据了。

#6


退出后就ShutDown关闭连接,清理...

#7


有道理..


do 

CString temp; 
pAo->ReadString(temp); 
strData += temp; 
} while (!pAo->IsBufferEmpty()); 

这个循环取数据...pAo->IsBufferEmpty 好像一直都是假..好像跟本不起作用..

我在接收邮件服务器返回的数据时后...readstring只读一行..就结束了..下次会再次触发OnRecive..
接收就会读取下面一行的内容了..
因为服务器返回的数据没有结束符给我判断,,,该怎么做才能把数据读完啊..

#1


是不是一些FIN包和keepalive之类
建议在里面判断一下temp
那样就不需要返回了

#2


因为这个事件不断的触发... 本来.邮件已经完..退出服务器了..要清理资源...现在这个事件不停的触发...
无法清理资源..等触发了10多次后..就不会再触发了...

#3


退出服务器了,应该调用一下socket的ShutDown()

#4


ShutDown 好像可以解决问题..为什么会这样呢..为什么要调用 ShutDown呢...

#5


因为你断开连接之后,数据队列中如果还存在数据,那些数据仍然会传送到接收数据的socket中,所以OnReceive仍然会响应。但你调用了ShutDown之后 socket就不再接收这些数据了。

#6


退出后就ShutDown关闭连接,清理...

#7


有道理..


do 

CString temp; 
pAo->ReadString(temp); 
strData += temp; 
} while (!pAo->IsBufferEmpty()); 

这个循环取数据...pAo->IsBufferEmpty 好像一直都是假..好像跟本不起作用..

我在接收邮件服务器返回的数据时后...readstring只读一行..就结束了..下次会再次触发OnRecive..
接收就会读取下面一行的内容了..
因为服务器返回的数据没有结束符给我判断,,,该怎么做才能把数据读完啊..