天天看点

TCP协议recv(_Out_writes_bytes_to_(len))参数

谨记:这是winx86环境下的代码

用size_t申请了一个len之后

然后我设计一个包长

if ((len <= 0) && (index <= 0))

{

return -1;

}

index += len;

len = index;

但是运行之后nSize和pData的大小是最大值,看下方局部变量窗口;

TCP协议recv(_Out_writes_bytes_to_(len))参数

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的路程很苦,但是也是成长的一步;