+ -
当前位置:首页 → 问答吧 → 这个函数看不懂奇怪,高手帮看下

这个函数看不懂奇怪,高手帮看下

时间:2010-09-15

来源:互联网

  1. int my_recv(int fd,void *buffer,int length)
  2. {
  3.         int bytes_left;
  4.         int bytes_read;
  5.         char *ptr;
  6.         bytes_left=length;
  7.         while(bytes_left>0)
  8.         {
  9.                 bytes_read=recv(fd,ptr,bytes_read,0);
  10.                 if(bytes_read<0)
  11.                 {
  12.                   if(errno==EINTR)
  13.                   {
  14.                          bytes_read=0;
  15.                   }else{
  16.                          return(-1);
  17.                   }
  18.                 }else if(bytes_read==0){
  19.                         break;
  20.                 }

  21.                 bytes_left-=bytes_read;
  22.                 ptr+=bytes_read;
  23.         }
  24.         return(length-bytes_left);
  25. }
复制代码
从网上找了端这个读socket的程序,看了糊涂了,buffer这个参数没用到?如何返回读出来的数据??bytes_read这个只定义了,都没来得及初始化就用上了,更奇怪的是,即使不出初始化,默认为0,那传递进去的是0,那recv函数还能读到数据呀,告诉帮忙解释下

作者: jd808   发布时间: 2010-09-15

前面少了ptr = buffer,recv里面应该是bytes_left
循环接收数据吧

作者: hellioncu   发布时间: 2010-09-15

确实少了ptr = buffer这么一句.

recv中的那个应该是bytes_left

作者: liwangli1983   发布时间: 2010-09-15

  1. int my_recv(int fd,char *buffer,int length)
  2. {
  3.         int bytes_left;
  4.         int bytes_read;
  5.         char *ptr;
  6.         ptr = buffer;
  7.         bytes_left=length;
  8.         while(bytes_left>0)
  9.         {
  10.                 bytes_read=recv(fd,ptr,bytes_left,0);
  11.                 if(bytes_read<0)
  12.                 {
  13.                   if(errno==EINTR)
  14.                   {
  15.                          bytes_read=0;
  16.                   }else{
  17.                          return(-1);
  18.                   }
  19.                 }else if(bytes_read==0){
  20.                         break;
  21.                 }

  22.                 bytes_left-=bytes_read;
  23.                 ptr+=bytes_read;
  24.         }
  25.         return(length-bytes_left);
  26. }
复制代码
改成这样子不行报
read error: Resource temporarily unavailable
这个错误,但我在外面用
if (recv(cfd, buf_s, sizeof(buf_s),0)< 0)
这种方法读确实可以读到数据的,大侠是什么原因啊

作者: jd808   发布时间: 2010-09-15