日期:2014-05-16  浏览次数:20790 次

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类型。
------解决方案--------------------
看看是不是多线程,内存越界访问之类的。
------解决方案--------------------
看看线程