关于CAysncSocket::Attch()的问题

yzx110 2003-09-07 03:00:56
调用这个函数的时候有什么特别的要求吗,为什么我每次用的m_hClientSock.Attch(m_pSock)时候都会出错,
调试的时候会报告“Test.exe 中的 0x0056322c 处未处理的异常: 0xC0000005: 读取位置 0x00000004 时发生访问冲突 。”

m_hClientSock使我从CAysncSocket派生出的类的对象,m_pSock是从CSocket的对象Detch()出来的。

谁知道的说说,谢谢!
...全文
16 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
jasn 2003-09-08
用静态链接就可以跟进去,看看Attach哪里出问题
回复
jasn 2003-09-08
可能是多线程的问题,CAysncSocket并不支持多线程。
回复
yzx110 2003-09-08
Healer过奖了,其实我远不如你的,你回答我还是很感谢的!以后多指教:(
回复
yzx110 2003-09-08
Detach 返回得值没问题。我贴一段程序看看!

在监听套接字类里面

void CListenSock::OnAccept(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
CAsyncSocket ClientSock;
Accept(ClientSock);

CClientThread* pThread = (CClientThread*)AfxBeginThread(RUNTIME_CLASS(CClientThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
if (!pThread)
{
ClientSock.Close();
return;
}
pThread->m_hSock = ClientSock.Detach();
pThread->ResumeThread();
CAsyncSocket::OnAccept(nErrorCode);
}

在用户界面线程类里面

BOOL CClientThread::InitInstance()
{
// TODO: 在此执行任意逐线程初始化
CFindMistakeDlg* pDlg = (CFindMistakeDlg*)theApp.m_pMainWnd;
if (pDlg->m_nCurrentUsers >= pDlg->GetMaxusers())
return FALSE;
try
{
if (!m_hClientSock.Attach(m_hSock)) //这里出问题,错误提示就是上面的那个
{
return FALSE;
}
m_hClientSock.m_pThread = this;
pDlg->m_hThreadSection.Lock();
pDlg->m_ThreadList.AddTail(this);
pDlg->m_hThreadSection.Unlock();
pDlg->m_nCurrentUsers ++;
}
catch(CException* e)
{
e->Delete();
return FALSE;
}
return TRUE;
}

不知道为什么?


问题只是处在m_hClientSock.Attach(m_hSock)这个函数里面。
看看调用过程
m_hClientSock.Attach(m_hSock);
CAsyncSocket::AttachHandle(hSocket, this);
ASSERT(CAsyncSocket::LookupHandle(hSocket, bDead) == NULL);
pState->m_pmapSocketHandle->GetvalueAt((void*)hSocket);

void* CMapPtrToPtr::GetvalueAt(void* key) const
// find value (or return NULL -- NULL values not different as a result)
{
if (m_pHashTable == NULL)
return NULL; //程序到这里返回,调试时错误也就指示这里

UINT nHash = HashKey(key) % m_nHashTableSize;

// see if it exists
CAssoc* pAssoc;
for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext)
{
if (pAssoc->key == key)
return pAssoc->value;
}
return NULL;
}
回复
Healer 2003-09-08
newbie??
你都三个角角了?? 厉害, 在飞翔我就不该多嘴:)
回复
kangfx 2003-09-08
相信传入的参数可能不是一个合法的值,你可以对Detach的返回值进行判断一下,另外也可以调用GetLastError看下原因
回复
xmndragon 2003-09-08
以下程序有你说到的用法,或许对你有帮助:
http://www.codeproject.com/internet/FTPServer/ftpserverSrc.zip
回复
yzx110 2003-09-08
问题解决了,就是把Attach放在CListenSock类的OnAccept函数里面

pThread->m_hClientSock.Attach(ClientSock.Detach());
这样就可以了
回复
ISAKEEPER 2003-09-08
不好意思,只能帮你顶了 :)
回复
yzx110 2003-09-07
程序有错是必然的,不然我就不发贴问了:(

我就是要找出这个错误是有什么引起的!!
潘大,谢谢!!
回复
Oversense 2003-09-07
显然是程序有错3
回复
相关推荐
发帖
网络编程
创建于2007-09-28

1.8w+

社区成员

VC/MFC 网络编程
申请成为版主
帖子事件
创建了帖子
2003-09-07 03:00
社区公告
暂无公告