免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2539 | 回复: 1
打印 上一主题 下一主题

[C] memcache 客户端一段读取socket内容的函数看不明白,请高手帮忙,thanks [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-21 19:53 |只看该作者 |倒序浏览
函数的功能应该是:从socket中读取数据,然后存在buffer所指的内存中,同时追加到ptr的缓存中。
  while (length)这块儿很奇怪,第一次ptr->read_buffer_length为0的时候会读取一次socket,然后把读取到的内容
放到buffer和ptr->read_buffer中,如果一次读完所有数据则直接跳出while,如果一次读了一部分,那接下来应该继续读,
但第二次时ptr->read_buffer_length已经不是0了,就不读了,这样的话就会陷入死循环了,好奇怪

  1. ssize_t memcached_io_read(memcached_server_st *ptr,
  2.                           void *buffer, size_t length)
  3. {
  4.   char *buffer_ptr;

  5.   buffer_ptr= buffer;

  6.   while (length)
  7.   {
  8.     if (!ptr->read_buffer_length)
  9.     {
  10.       ssize_t data_read;

  11.       while (1)
  12.       {
  13.         data_read= read(ptr->fd,
  14.                         ptr->read_buffer,
  15.                         MEMCACHED_MAX_BUFFER);
  16.         if (data_read > 0)
  17.           break;
  18.         else if (data_read == -1)
  19.         {
  20.           ptr->cached_errno= errno;
  21.           switch (errno)
  22.           {
  23.           case EAGAIN://io是非阻塞模式,但进程在读操作时被延迟了
  24.           case EINTR: //被信号中断,或者没数据传输,或者负责这个文件的资源管理器不报告部分传输
  25.             {
  26.               memcached_return rc;

  27.               rc= io_wait(ptr, MEM_READ);

  28.               if (rc == MEMCACHED_SUCCESS)
  29.                 continue;
  30.             }
  31.           /* fall trough */
  32.           default:
  33.             {
  34.               memcached_quit_server(ptr, 1);
  35.               return -1;
  36.             }
  37.           }
  38.         }
  39.         else
  40.         {
  41.           /*
  42.            *这里的意思应该是服务器已经挂掉了,做清理操作
  43.           */
  44.           memcached_quit_server(ptr, 1);
  45.           return -1;
  46.         }
  47.       }

  48.       ptr->io_bytes_sent = 0;//?
  49.       ptr->read_data_length= data_read;
  50.       ptr->read_buffer_length= data_read;
  51.       ptr->read_ptr= ptr->read_buffer;
  52.     }

  53.     if (length > 1)
  54.     {
  55.       size_t difference;

  56.       difference= (length > ptr->read_buffer_length) ? ptr->read_buffer_length : length;

  57.       memcpy(buffer_ptr, ptr->read_ptr, difference);
  58.       length -= difference;
  59.       ptr->read_ptr+= difference;
  60.       ptr->read_buffer_length-= difference;
  61.       buffer_ptr+= difference;
  62.     }
  63.     else
  64.     {
  65.       *buffer_ptr= *ptr->read_ptr;
  66.       ptr->read_ptr++;
  67.       ptr->read_buffer_length--;
  68.       buffer_ptr++;
  69.       break;
  70.     }
  71.   }

  72.   return (size_t)(buffer_ptr - (char*)buffer);
  73. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2009-04-22 12:57 |只看该作者
顶一下,继续求助,高手们请帮帮忙,万分感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP