是的,打印过nRealLen-1,都是4G,已经确定是new太大引起的out of memory
现在的问题是,不知道ReceiveFrom返回error的原因是什么,错误码不对劲啊。 另外还有一点不明白,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的情况。 你用strerr(errno)打印一下试试、 回复 13# freeeyes
errno是22,strerror(22)是Invalid argument,更邪了。
不过我还是觉得用ms自己的GetLastError()更靠谱些,c标准的errno在win下范围有限。 nt nRealLen = ReceiveFrom(buffer, sizeof buffer, (SOCKADDR*)&sockAddr, &iSockAddrLen);
这里报错是吧,如果提示Invalid argument,有可能是你的buffer指针是非法的。导致这个错误。或许检查一下你的buffer指针是否有效。 前面代码是这样的:
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不提供也没办法。。。 SOCKADDR_IN sockAddr = {0};
int iSockAddrLen = sizeof sockAddr;
这里代码看着有点怪。 sizeof 比
sizeof()
加个括号可读性强多了... sizeof 是operator不是函数,所以这样写也是可以的。
这段代码不是我写的,不过我也习惯这样写sizeof,可能很多人看了会不习惯,呵呵 另外ReceiveFrom码多数情况是返回正确的,也不像是参数出了问题。
页:
1
[2]