免费注册 查看新帖 |

Chinaunix

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

[网络] 读取sock出错,gdb中调试确正常 [复制链接]

论坛徽章:
1
处女座
日期:2014-11-29 14:47:43
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-22 10:33 |只看该作者 |倒序浏览
本帖最后由 Gnixfeng 于 2014-11-22 11:09 编辑

问题已解决,太专注于别的东西,又犯低级错误了!nread声明为size_t类型,即是一个无符号的长整数的类型!所以不可能等于负数!

使用线程在一个非阻塞的sock中读固定个字节的内容,出现了很奇怪的问题,下面是代码
  1. ssize_t
  2. readn(int fd, void *vptr, size_t n)
  3. {
  4.     size_t  nleft;
  5.     size_t  nread;
  6.     char    *ptr;

  7.     ptr = vptr;
  8.     nleft = n;

  9.     while(nleft > 0) {
  10.         if ( (nread = read(fd, ptr, nleft)) < 0) {
  11.             if (nread < 0 && errno == EINTR){
  12.                 nread = 0;          /* call again */
  13.             }else if (errno == EAGAIN || errno == EWOULDBLOCK){
  14.                 continue;          /* nonblocking */
  15.             }else
  16.                 return(-1);           /* error */
  17.         }else if(nread == 0)
  18.             break;
  19.       
  20.         nleft -= nread;
  21.         ptr += nread;
  22.     }
  23.     return(n - nleft);
  24. }
复制代码
上面这段代码一直没有返回,但是在gdb中readn这里设置断点调试却可以正常返回,如果不设置断点照样出不返回!奇怪了!
然后修改了一下代码,如下
  1. ssize_t
  2. readn(int fd, void *vptr, size_t n)
  3. {
  4.     size_t  nleft;
  5.     size_t  nread;
  6.     char    *ptr;

  7.     ptr = vptr;
  8.     nleft = n;
  9.     int     i = 0;      /* 用完删除*/

  10.     printf("read size %d\n", n);
  11.     while(nleft > 0) {
  12.         if ( (nread = read(fd, ptr, nleft)) < 0) {
  13.             if (nread < 0 && errno == EINTR){
  14.                 nread = 0;          /* call again */
  15.             }else if (errno == EAGAIN || errno == EWOULDBLOCK){
  16.                 continue;          /* nonblocking */
  17.             }else
  18.                 return(-1);           /* error */
  19.         }else if(nread == 0)
  20.             break;
  21.         if ( i < 10)   
  22.             printf("nread = %d errno = %d\n", nread, errno);
  23.         i++;
  24.         nleft -= nread;
  25.         ptr += nread;
  26.     }
  27.     return(n - nleft);
  28. }
复制代码
使用上面的代码读16个字节的输出如下
nread = -1 errno = 11
nread = -1 errno = 11
nread = -1 errno = 11
nread = -1 errno = 11
nread = -1 errno = 11
nread = -1 errno = 11
nread = -1 errno = 11
nread = 16 errno = 11
nread = -1 errno = 11
nread = -1 errno = 11
。。。
已经读了16字节依然没有返回!
如果在 if ( (nread = read(fd, ptr, nleft)) < 0) {}中加入输出语句,发现根本没有输出, if ( (nread = read(fd, ptr, nleft)) < 0) {}中的代码根本没有没有执行!即使read返回-1!但是这些代码在gdb中设置断点在readn都可以正常执行。
这是什么问题呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP