牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

IOCP+UDP收包的时候:报0xC000000005,读取0x00000010错误的问题

最近发现我那简单得不再简单的IOCP+UDP的底层出错了,在大数据量的时候经常会报错,并且清一色都是报的:报0xC000000005,读取0x00000010错误.报错之后,整个程序的堆栈就全部破坏掉了.从发现问题到今日问题的解决,已经过去了一个月的时间.
唯一能够找到相关的资料只有:http://www.cppblog.com/HendricLee/archive/2008/07/29/57436.html
但是事实上,我的Overlapped都是复用的.因此,不大可能是此问题导致的.经过测试证明,也确实与此无关.
昨晚上又做了一系列的测试,结果到最后依旧是无果,百般无奈之下,只好问人,后面QQ好友Sagasarate告诉了我原委,我知道之后,只有两种感觉:想哭,想撞墙.
至于为什么,请看以下代码便知了.非常非常之低级的错误.
bool CUDPRecvSendThread::postRecvRequest(CUdpOverLappedRecv* pOverLappedRecv)
{
    ASSERT(pOverLappedRecv);
    
if (pOverLappedRecv == NULL) return false;

    pOverLappedRecv
->Reset();

    DWORD dwBytesRecv 
= 0;
    DWORD dwFlags 
= 0;
    
int nSenderAddrSize = sizeof (sockaddr_in);

    
int rc = 0;
    rc 
= ::WSARecvFrom(m_ServerSocket, pOverLappedRecv->GetWsaBuffer(), 1&dwBytesRecv, &dwFlags,
        pOverLappedRecv
->GetClientAddr(), &nSenderAddrSize,
        pOverLappedRecv
->GetOverlapped(), NULL);

    
if (rc == SOCKET_ERROR)
    
{
        DWORD dwErrorCode 
= ::WSAGetLastError();
        
if (dwErrorCode != WSA_IO_PENDING)
        
{
            
return false;
        }

    }


    
return true;
}
请对照着MSDN看.
如果没看出来,那我来告诉你是为什么.
问题就在于WSARecvFrom的7个参数.
MSDN的描述:
lpFromlen [in, out]

A pointer to the size, in bytes, of the "from" buffer required only if lpFrom is specified.

你会发现,这个参数是一个输入输出值.而WSARecvFrom投递的是一个异步的IOCP请求,故而,出了此方法(CUDPRecvSendThread::postRecvRequest)之后,nSenderAddrSize这个临时变量就会被回收.不出事才怪了.
好吧,这事就是我干出来的.今年竟是做一些脑残的事情.肿么了我这是.T_T
要解决这个问题,最好的办法就是把nSenderAddrSize作为CUdpOverLappedRecv的成员变量保存,这样生命周期可以得以保证.
好吧,这件脑残事就这么结了.

posted on 2012-10-15 11:42 杨粼波 阅读(1732) 评论(8)  编辑 收藏 引用 所属分类: 原创文章网络编程C++Windows

评论

# re: IOCP+UDP收包的时候:报0xC000000005,读取0x00000010错误的问题 2012-10-16 03:37 fzy

看了你代码,不是你说的问题。
是因为这里是个LPINT,是INT的指针,你的nSenderAddrSize没有加&取地址符号。

  回复  更多评论   

# re: IOCP+UDP收包的时候:报0xC000000005,读取0x00000010错误的问题 2012-10-16 15:56 杨粼波

@fzy
好吧,你足够仔细,遗漏了.  回复  更多评论   

# re: IOCP+UDP收包的时候:报0xC000000005,读取0x00000010错误的问题 2013-02-08 09:04 cc7799

我也碰到了同样的问题,多谢指点,现在问题解决了,非常感谢!  回复  更多评论   

# re: IOCP+UDP收包的时候:报0xC000000005,读取0x00000010错误的问题 2013-05-31 15:24 谢谢哦

谢谢了兄弟,我也是费了一周时间啊  回复  更多评论   

# re: IOCP+UDP收包的时候:报0xC000000005,读取0x00000010错误的问题[未登录] 2013-05-31 17:29 杨粼波

@cc7799
@谢谢哦
咱们都是犯了粗心的毛病.很高兴这个经验共享能够带给你们帮助.  回复  更多评论   

# re: IOCP+UDP收包的时候:报0xC000000005,读取0x00000010错误的问题 2013-09-29 16:44 brainpoint

谢, 刚好刚碰上  回复  更多评论   

# re: IOCP+UDP收包的时候:报0xC000000005,读取0x00000010错误的问题 2013-10-21 17:29 马儿快跑

同样浪费了我2天的debug。找打问题后,再从网络上找到这个问题。同样想哭  回复  更多评论   

# re: IOCP+UDP收包的时候:报0xC000000005,读取0x00000010错误的问题[未登录] 2013-10-22 15:26 杨粼波

@brainpoint
很高兴能够帮助到你.

@马儿快跑
呃.....终于找到了一样二的人了.哈哈哈哈哈.....我一开始以为只有我一个人这么二,原来我不是唯一的一个,我好安慰啊....  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理