recv读取套接字返回值问题
我用的是非阻塞模式读取套接字内容,sz 为要读取的字节数,有的时候能够正常输出结果,但是有时候结果却输出:r_len > 0 r_len = -1,这是为什么啊?从没遇见过!请求高手指点一下!
while(sz != 0)
{
r_len = recv(s_fd, p1, sz, 0);
if (r_len < 0)
{
if ((errno == EINTR) || (errno == EWOULDBLOCK))
{
sleep(1);
continue;
}
xlog_error(__FILE__,__LINE__,"recv(): %s !", strerror(errno));
close(s_fd);
s_fd = -1;
goto connect;
}
if (r_len == 0)
{
printf("The server is close socket !");
break;
}
if (r_len > 0)
{
printf("r_len > 0 r_len = %d\n", r_len);
sz -= r_len;
p1 += r_len;
}
}
------解决方案--------------------没看出问题
------解决方案--------------------查看recv函数帮助文档:
#man recv
一般是对方关闭了连接。
------解决方案--------------------同样没看出来。
------解决方案--------------------请问你的r_len是什么类型?
如果你的r_len是unsigned (size_t也是unsigned类型)类型的话,
那就会出现这种情况 。
如果r_len 为unsigned类型,那么在和别的数比较时,都会提升为unsigned类型
则r_len < 0的结果肯定会为false
而printf里面又是%d , , ,传到printf里面的时候,r_len会做一次隐式类型转换为signed类型。从而导致r_len被输出为-1 ..
在程序里面最好不要使用unsigned类型,即使有些时候只可能表示正的情况 (如年龄,身高等). 否则在做比较的时候一定要注意类型的隐式提升! 最近正在看《C专家编程》里面的话。
不信你可以试试下面一句话
#include <stdio.h>
int main(void)
{
unsigned a ;
a = -1;
if( a < 0)
printf("a < 0!!\n");
else
printf("a >= 0!!!\n");
printf("%%u : %u\n" , a);
printf("%%d : %d\n" , a);
return 0;
}
------解决方案--------------------recv的标准返回值类型ssize_t 是一种signed 类型
而size_t 是一种unsigned类型。
------解决方案--------------------看看是不是多线程,内存越界访问之类的。
------解决方案--------------------看看线程