为何CSocket的对象不让Close()

NewFree 2004-08-11 04:17:22
有个TCP方式的连接
class CListenSocket : public CAsyncSocket
其在Listen和Accept的时候:
void CListenSocket::OnAccept(int nErrorCode)
{
CAsyncSocket::OnAccept(nErrorCode);

CReceiveSocket *pRequest = new CReceiveSocket(pOwner);
if ( Accept( *pRequest ) )
{
pRequest->AsyncSelect( FD_READ|FD_CLOSE );
pOwner->m_connectionList.AddTail( pRequest );//此处将请求连接放入LIst中缓存。
}
else
delete pRequest;
}
class CReceiveSocket : public CSocket

问题是我在某动作后会清此连接链链表调用CloseTcpSocket,会出错:
void CMyDoc::CloseTcpSocket()
{
POSITION pos,temp;
for(pos = m_connectionList.GetHeadPosition(); pos != NULL;)
{
temp = pos;
CReceiveSocket* pSock = (CReceiveSocket*) m_connectionList.GetNext(pos);
if (pSock != NULL)
{
pSock->Close();//此句出错
m_connectionList.RemoveAt(temp);
delete pSock;
}
}
}

pSock->Close();//出错的提示是CSocket::Close()中的VERIFY(ASyncSelect(0));导致CAsyncSocket::AsyncSelect()中的ASSERT(pState->m_hSocketWindow != NULL);此处句柄为空!!!


还有问题是同样的CloseTcpSocket()我在CMyDoc::~CMyDoc()调用就没有问题:
CMyDoc::~CMyDoc()
{
...
CloseTcpSocket();
...
}


...全文
178 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
NewFree 2004-12-03
  • 打赏
  • 举报
回复
没解决,但还是结帖吧!
dragon1975 2004-10-10
  • 打赏
  • 举报
回复
把CLOSE操作写在CListenSocket的ONCLOSE()中,在CLOSE之前最好先SHUTDOWN(2);
NewFree 2004-08-11
  • 打赏
  • 举报
回复
试过了不行
howtotell 2004-08-11
  • 打赏
  • 举报
回复
把关闭的操作写在那个类的析构函数中试试.
a_melon 2004-08-11
  • 打赏
  • 举报
回复
CSocket 要依赖于一个窗口的...
我下班了,怀疑问题在于此。
88
NewFree 2004-08-11
  • 打赏
  • 举报
回复
to : a_melon(瓜) :我在Listen时创建的,哪有窗口呀?

to : oyljerry(勇敢的心) ( ,我是在send完后Sleep(30000)后才Close()的,另外我应该可以随时关闭的!

oyljerry 2004-08-11
  • 打赏
  • 举报
回复
在你的socket完成所有的操作后,再closesocket
a_melon 2004-08-11
  • 打赏
  • 举报
回复
在哪个窗口里创建的,则在哪个窗口Close

18,356

社区成员

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

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