wishel 发表于 2010-8-4 18:02:46

回复 9# freeeyes

是的,打印过nRealLen-1,都是4G,已经确定是new太大引起的out of memory
现在的问题是,不知道ReceiveFrom返回error的原因是什么,错误码不对劲啊。

wishel 发表于 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的情况。

freeeyes 发表于 2010-8-4 18:38:41

你用strerr(errno)打印一下试试、

wishel 发表于 2010-8-5 10:50:53

回复 13# freeeyes

errno是22,strerror(22)是Invalid argument,更邪了。
不过我还是觉得用ms自己的GetLastError()更靠谱些,c标准的errno在win下范围有限。

freeeyes 发表于 2010-8-5 16:28:20

nt nRealLen = ReceiveFrom(buffer, sizeof buffer, (SOCKADDR*)&sockAddr, &iSockAddrLen);
这里报错是吧,如果提示Invalid argument,有可能是你的buffer指针是非法的。导致这个错误。或许检查一下你的buffer指针是否有效。

wishel 发表于 2010-8-6 09:44:30

前面代码是这样的:

      BYTE buffer;
        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不提供也没办法。。。

freeeyes 发表于 2010-8-6 18:07:57

SOCKADDR_IN sockAddr = {0};
int iSockAddrLen = sizeof sockAddr;
这里代码看着有点怪。

Jack 发表于 2010-8-6 19:02:41

sizeof 比
sizeof()
加个括号可读性强多了...

wishel 发表于 2010-8-9 11:03:31

sizeof 是operator不是函数,所以这样写也是可以的。
这段代码不是我写的,不过我也习惯这样写sizeof,可能很多人看了会不习惯,呵呵

wishel 发表于 2010-8-9 11:08:59

另外ReceiveFrom码多数情况是返回正确的,也不像是参数出了问题。
页: 1 [2]
查看完整版本: vs2005开发,Out of memory对话框的问题