谨记:这是winx86环境下的代码
用size_t申请了一个len之后
然后我设计一个包长
if ((len <= 0) && (index <= 0))
{
return -1;
}
index += len;
len = index;
但是运行之后nSize和pData的大小是最大值,看下方局部变量窗口;
nSize是32位无符号整数的十进制最大值,所以断定包长并没有被if ((len <= 0) && (index <= 0))限制,
1.开始判断应该是循环没起到限制的作用,检查之后不是。
2.这个问题导致的是内存不足,所以又检查了内存申请。但是也不是。
3.还有的问题就是服务端的接收问题,但是这里的代码基本上和服务端的是一致的。所以也不是
在这些大的问题上没有查到任何错误,那错误在于符号,或者是使用的函数错误。
后来可以断定这是类型的错误,就是函数参数的类型。因为除了类型错误在定义变量时不会有别的错误
(当然一开始我也不是很熟);好的在往下看:
recv函数原型:
recv(
_In_ SOCKET s,
_Out_writes_bytes_to_(len, return) __out_data_source(NETWORK) char FAR * buf,
_In_ int len,
_In_ int flags
);
看第二个参数_Out_writes_bytes_to_里的len;再到定义到:
发现他是unsigned long类型的,这里会有一个基础,size_t类型是unsigned int 类型,但是len是long类型会将外层的len隐式转换为long,所以这个定义没有意义,就会出现上边的错误。
那么最简单的方法就不需要解释了,就是这样
if (((int)len <= 0) && (index <= 0))
{
return -1;
}
如果你的环境和我的不一样,定义之前一定看好recv这个函数;
找bug的路程很苦,但是也是成长的一步;