关于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()出来的。

谁知道的说说,谢谢!
...全文
72 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
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

18,356

社区成员

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

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