很奇怪的问题,晕了!

精锐掷矛手 2010-01-13 10:43:32
DWORD WINAPI IOCP::AcceptThread( void *pParam )
{
IOCP * m_piocp=reinterpret_cast<IOCP*>(pParam);
if(!m_piocp)
return -1;

SOCKET sListen = m_piocp->m_listen; //监听套接字
SOCKET sAccept = INVALID_SOCKET;
HANDLE hComPort = m_piocp->m_IOHandle; //完成端口

while (m_piocp->m_Run)
{
DWORD dwRet;
dwRet = WSAWaitForMultipleEvents(1,&m_piocp->m_Accept,FALSE,100,FALSE);
if(!m_piocp->m_Run) //服务器停止服务
break;

if (dwRet == WSA_WAIT_TIMEOUT) //函数调用超时
continue;

WSANETWORKEVENTS events; //查看发生的网络事件
int nRet = WSAEnumNetworkEvents(sListen,m_piocp->m_Accept,&events);
if (nRet == SOCKET_ERROR)
{
m_piocp->AppendLog("WSAEnumNetworkEvents函数错误");
break;
}

if ( events.lNetworkEvents & FD_ACCEPT) //发生FD_ACCEPT网络事件
{
if ( events.iErrorCode[FD_ACCEPT_BIT] == 0 && m_piocp->m_Run)
{
SOCKADDR_IN ClientAddr;
int serAddrLen = sizeof(ClientAddr);
sAccept=WSAAccept(sListen,(SOCKADDR*)&ClientAddr,&serAddrLen,ConnectAcceptCondition,0);

if (INVALID_SOCKET==sAccept)
return -1;

if (!m_piocp->m_Run)
{
closesocket(sAccept);
return -1;
}
//创建客户端对象
ClientContext * Client= new ClientContext(ClientAddr,sAccept);

if (CreateIoCompletionPort((HANDLE)sAccept, hComPort,(DWORD)Client,0) == NULL)
return -1;
m_piocp->AddToClientList(Client);

if(!Client->Recv())
m_piocp->RemoveClient(Client);
}
}
}
return 0;

}
每执行到红色代码时,boundsChecker提示Questionable use of thread.Thread created using CreateThread rather than _beginthread
vc输出irst-chance exception in IOCPServer.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
程序运行一段时间后报错,Client的数据被篡改了,应该是内存越界。内存越界跟这个现象有关系吗?
很迷惑,望高手指教?
...全文
163 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
精锐掷矛手 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sksgod 的回复:]
应该不是释放问题吧,才刚new就boundsChecker提示Questionable use of thread.Thread created using CreateThread rather than _beginthread 报错了,还等不到继续执行
[/Quote]
我感觉也是啊,问题搞了两个星期了,郁闷。
精锐掷矛手 2010-01-13
  • 打赏
  • 举报
回复
在工作线程中检测释放的ClientContext
精锐掷矛手 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lllyyy2403 的回复:]
ClientContext * Client= new ClientContext(ClientAddr,sAccept);
client的释放在哪?
[/Quote]
void IOCP::RemoveClient(ClientContext *Client)
{
if (Client!=NULL)
{
EnterCriticalSection(&g_csClientList);
std::vector <ClientContext *>::iterator IterClientContext;
//Remove the supplied ClientContext from the list and release the memory
for (IterClientContext = g_ClientContext.begin(); IterClientContext != g_ClientContext.end(); IterClientContext++)
{
if (Client==*IterClientContext)
{
CString tempphone("");
tempphone+=Client->phoneNumber;
_bstr_t SQL;
SQL="update customer_wells set current_online=0 where well_gprsphone='"+tempphone+"'";
EnterCriticalSection(&g_csAdo);
m_ado.ExecuteSQL(SQL);
LeaveCriticalSection(&g_csAdo);

g_ClientContext.erase(IterClientContext);
//i/o will be cancelled and socket will be closed by destructor.
delete Client;
Client=NULL;
break;
}
}
LeaveCriticalSection(&g_csClientList);
::PostMessage(m_hWndServer,WM_UPDATA,0,0);
}

}
精锐掷矛手 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 vclongking 的回复:]
内存的控制调度最好配对 这样不会乱
你new的资源 不需要 就自己释放了
[/Quote]
我明白你的意思,我的代码运行一段时间后出错,客户端内容被篡改了。我检查了用到的数组,应该没有越界。所以我想是不是根客户端的初始化有关呢?
lllyyy2403 2010-01-13
  • 打赏
  • 举报
回复
ClientContext * Client= new ClientContext(ClientAddr,sAccept);
client的释放在哪?
vclongking 2010-01-13
  • 打赏
  • 举报
回复
内存的控制调度最好配对 这样不会乱
你new的资源 不需要 就自己释放了
精锐掷矛手 2010-01-13
  • 打赏
  • 举报
回复
new的时候没有用beginThread,ClientContext在程序退出或客户端自己退出的时候才delete
一条晚起的虫 2010-01-13
  • 打赏
  • 举报
回复
//运行到这句,boundsChecker警告,是没办法的,估计ClientContext new的时候用了beginThread。
// new的东西delete了没有?
精锐掷矛手 2010-01-13
  • 打赏
  • 举报
回复
ding
sksgod 2010-01-13
  • 打赏
  • 举报
回复
应该不是释放问题吧,才刚new就boundsChecker提示Questionable use of thread.Thread created using CreateThread rather than _beginthread 报错了,还等不到继续执行

18,356

社区成员

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

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