找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: wishel

vs2005开发,Out of memory对话框的问题

  [复制链接]
 楼主| 发表于 2010-8-4 18:02:46 | 显示全部楼层
回复 9# freeeyes

是的,打印过nRealLen-1,都是4G,已经确定是new太大引起的out of memory
现在的问题是,不知道ReceiveFrom返回error的原因是什么,错误码不对劲啊。
 楼主| 发表于 2010-8-4 18:08:01 | 显示全部楼层
另外还有一点不明白,ReceiveFrom是udp用的,但msdn上有关返回值说了这样一句:If the connection has been closed, it returns 0.
udp没有connection的概念,即使有connect函数也是伪的,没有类似tcp中的fin包,所以不存在 ”the connection has been closed“这个概念吧。 那么到底是什么时候会触发ReceiveFrom返回0呢?

我上面的代码确实捕捉到过有返回值为0的情况。
发表于 2010-8-4 18:38:41 | 显示全部楼层
你用strerr(errno)打印一下试试、
 楼主| 发表于 2010-8-5 10:50:53 | 显示全部楼层
回复 13# freeeyes

errno是22,strerror(22)是Invalid argument,更邪了。
不过我还是觉得用ms自己的GetLastError()更靠谱些,c标准的errno在win下范围有限。
发表于 2010-8-5 16:28:20 | 显示全部楼层
nt nRealLen = ReceiveFrom(buffer, sizeof buffer, (SOCKADDR*)&sockAddr, &iSockAddrLen);
这里报错是吧,如果提示Invalid argument,有可能是你的buffer指针是非法的。导致这个错误。或许检查一下你的buffer指针是否有效。
 楼主| 发表于 2010-8-6 09:44:30 | 显示全部楼层
前面代码是这样的:

        BYTE buffer[5000];
        SOCKADDR_IN sockAddr = {0};
        int iSockAddrLen = sizeof sockAddr;
        int nRealLen = ReceiveFrom(buffer, sizeof buffer, (SOCKADDR*)&sockAddr, &iSockAddrLen);

现在我在后面加了句:
        if(nRealLen == SOCKET_ERROR || nRealLen == 0)
                return;

目前只能做到这样了,出错原因ms不提供也没办法。。。
发表于 2010-8-6 18:07:57 | 显示全部楼层
SOCKADDR_IN sockAddr = {0};
int iSockAddrLen = sizeof sockAddr;
这里代码看着有点怪。
发表于 2010-8-6 19:02:41 | 显示全部楼层
sizeof 比
sizeof()
加个括号可读性强多了...
 楼主| 发表于 2010-8-9 11:03:31 | 显示全部楼层
sizeof 是operator不是函数,所以这样写也是可以的。
这段代码不是我写的,不过我也习惯这样写sizeof,可能很多人看了会不习惯,呵呵
 楼主| 发表于 2010-8-9 11:08:59 | 显示全部楼层
另外ReceiveFrom码多数情况是返回正确的,也不像是参数出了问题。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-21 19:11 , Processed in 0.021671 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表