测试前通宵未睡,一年中白天最长的一天睡了一天,晚上去测,数据是否准确

百度拇指医生
&&&普通咨询
您的网络环境存在异常,
请输入验证码
验证码输入错误,请重新输入//监听线程
DWORD WINAPI CService::ClientListen(void* p)
while(TRUE)
SOCKET clientSocket=::accept(m_pInstance-&m_hServiceSocket,NULL,NULL);
if(clientSocket==SOCKET_ERROR)
::CreateIoCompletionPort((HANDLE)clientSocket,m_pInstance-&m_hServiceIocp,0,0);
LPIOCONTEXT pIoContext=(LPIOCONTEXT)GlobalAlloc(GPTR, sizeof( IOCONTEXT));
pIoContext-&wsaBuffer.buf=pIoContext-&pWorkB
pIoContext-&wsaBuffer.len=10;
//下面的代码会引发非常诡异的问题,后面会讲到
UINT nRetVal =::WSARecv((SOCKET)clientSocket,&(pIoContext-&wsaBuffer),1,&(pIoContext-&dwIoSize),&(pIoContext-&dwlFlags),&(pIoContext-&overlapped), NULL);/*关键位置A*/
上面的这段代码看上去没什么问题,但事实上会引发服务崩溃。接着看:C/C++ code
//完成处理线程
WINAPI CService::DoService(void* p)
DWORD dwBytesXfered=0;
DWORD dwKey=0;
LPIOCONTEXT pIoContext=NULL;
while(TRUE)
GetQueuedCompletionStatus(m_pInstance-&m_ServiceIocp,&dwBytesXfered,&dwKey,(LPOVERLAPPED*)(&pIoContext),INFINITE);
GlobalFree(pIoContext);/*位置B*/
上面这段代码看上去也没有问题(其实也确实没问题),但死了我无数的脑细胞。问题描述:服务器在接受几个连接之后,要么无故退出,要么就是程序出错Windows要关闭它。通过调试器运行,提示堆破坏,难道有使用了已释放的内存?检查了3个小时,没找出有可能出现内存错误的地方。后来实在没办法了,把所有的分配内存的地方地改成GlobalAlloc与GlobalFree,但问题仍旧存在。最后,干脆把所有的内存释放的地方全去掉,然后逐个调试(加上一个,运行一遍),看看到底是哪个内存出错了,昨晚大部会时间花在这上面了(调试堆破坏我只有这一个办法,不知道高手有其它方法没有?望赐教!)。最后定位到上面的B处 GlobalFree。但究竟是什么原因造成的呢?在网上也找不出所以然,最后几乎快要放弃了,但偶然间改了A处的两个地方,服务器安全运行了(激动啊)!!改变如下:UINT nRetVal =::WSARecv((SOCKET)clientSocket,&(pIoContext-&wsaBuffer),1,&(pIoContext-&dwIoSize),&(pIoContext-&dwlFlags),&(pIoContext-&overlapped), NULL);变为DWORD dwRecvbytes=0;DWORD dwlFlags=0;UINT nRetVal =::WSARecv((SOCKET)clientSocket,&(pIoContext-&wsaBuffer),1,&dwIoSize,&dwlFlags,&(pIoContext-&overlapped), NULL);也就是说,把WSARecv 第4、第5个参数改成使用局部变量。现在问题是解决了,但具体原因还只是猜测:如果不使用局部变量作为参数,那么在IO 等待中系统将会一直引用这两个变量,就算是一个IO完成了,系统内部仍然在使用所以当释放内存后,系统再次使用变量时就破坏了堆数据。上面的废话比较多,希望大家能看懂,同时也希望看明白的说说自己的看法。做服务器我是新手,希望高手多多指点!------解决方案--------------------IOCP是什么咚咚?学习学习
------解决方案--------------------探讨IOCP是什么咚咚?学习学习
------解决方案--------------------对阿.没有做过.学习一下.IOCP都能做什么,主要在用在哪些方面?是服务程序?
------解决方案--------------------探讨对阿.没有做过.学习一下.IOCP都能做什么,主要在用在哪些方面?是服务程序?
------解决方案--------------------顶下!!
------解决方案--------------------感觉像是多线程没有同步好啊,怎么不用debug版,加入dump代码,在崩溃时看下堆栈具体情况呢。内存越界了,表现出的现象不太一致,进程很容易飞掉的。
------解决方案--------------------不会C++………………
------解决方案--------------------
------解决方案--------------------表示很难看懂
------解决方案--------------------学习学习~~~
------解决方案-------------------- 共&2&页:
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有昨天通宵一晚上没有睡,今天也没有补觉,今天晚上11点睡到几点明天起来能不困?_百度知道
昨天通宵一晚上没有睡,今天也没有补觉,今天晚上11点睡到几点明天起来能不困?
提问者采纳
晚上洗个热水澡,上床深度睡眠,明天早七点起床就行。
提问者评价
太给力了,你的回答完美的解决了我的问题!
其他类似问题
为您推荐:
其他3条回答
如果没什么事。秋季适合早睡早起,建议睡觉时间从11点提前到九点半左右这个一宿很难补回来
这哪儿说得准
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 通宵一天 的文章

 

随机推荐