免费注册 查看新帖 |

Chinaunix

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

一个网络传输的程序出错,找不到问题,高手帮忙看看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-15 21:49 |只看该作者 |倒序浏览
是一个网络程序,其中一个数据接收的函数有问题,实在找不到问题出在什么地方了
参数char *buf,是在调用函数中定义的一个char buf[255],也试过用 char *buf;buf = (char*)malloc(255);还是出一样的问题
也试过在函数里面定义一个局部变量char cbuf[255],结果还是有问题...

  1. int net_recv(int fd, char *buf, int len)
  2. {
  3.     int ret;
  4.     fd_set rfds;
  5.     struct timeval tv;

  6.     FD_ZERO(&rfds);
  7.     FD_SET(fd, &rfds);
  8.     tv.tv_sec = 0;
  9.     tv.tv_usec = 100000;
  10. /*
  11.     if (rmnet_check(fd) < 0)
  12.     {
  13.         return -1;
  14.     }
  15. */
  16.     ret = select(fd+1, &rfds, NULL, NULL, &tv);
  17.     if (ret == -1)
  18.         return -1;
  19.     if (ret > 0 && FD_ISSET(fd, &rfds))
  20.     {
  21.         ret = recv(fd, buf, len, MSG_DONTWAIT);
  22.         if (ret < 0)
  23.         {
  24.             return -1;
  25.         }
  26.         return ret;
  27.     }

  28.     return 0;
  29. }

  30. int net_recvcmd(int fd, char *buf, int len)
  31. {
  32.     int ret;
  33.     int i, j;
  34.     int slen;
  35.     int recvlen;
  36.     ushort rcrc;
  37.     ushort ccrc;
  38.     time_t t;
  39.     char *poff;

  40.     slen = 0;
  41.     recvlen = 3;
  42.     time(&t);
  43.     while (time() - t < RecvCmdTimeout)//判断是否超时
  44.     {
  45.         usleep(1000);
  46.         ret = rmnet_recv(fd, buf+slen, recvlen);//recvlen默认为3,主要是因为传送格式为<>crc16,为了保证不读超出,所以每次只读3个字节
  47.         if (ret < 0)
  48.             return -1;
  49.         if (ret > 0)
  50.         {
  51.             slen += ret;
  52.             buf[slen] = 0;
  53. printf("slen: %d, buf addr: 0x%lx, buf: %s\n", slen, buf, buf);
  54. /*         //这一段代码因为现在出现的错误,所以暂时注释掉,这段代码主要作用是把开始符'<'之前的数据丢弃掉
  55.             if (buf[0] != '<')
  56.             {
  57.                 poff = strchr(buf, '<');
  58.                 if (poff == NULL)
  59.                 {
  60.                     slen = 0;
  61.                     continue;
  62.                 }
  63.                 else
  64.                 {
  65.                     strcpy(buf, poff);
  66.                     slen = strlen(buf);
  67.                 }
  68.             }*/
  69.             //判断是否读到结束符'>',如果未读到则继续读,如果已读到则判断是否已读完>和最后的2个字节crc
  70.             poff = strchr(buf, '>');
  71.             if (poff == NULL)
  72.                 continue;
  73.             if (slen >= poff - buf + 3)
  74.             {
  75.                 slen = poff - buf + 3;
  76.                 buf[slen] = 0;
  77.                 memcpy(&rcrc, buf+slen-2, 2);
  78.                 ccrc = GetCrc16(buf, slen-2);
  79.                 if (rcrc != ccrc)
  80.                     return -1;
  81.                 slen -= 2;
  82.                 buf[slen] = 0;
  83.                 printf("buf: %s\n");
  84.                 return slen;
  85.             }
  86.             else
  87.             {
  88.                 recvlen = (poff-buf+3) - slen;//当已经读到'>'了以后,只读出后面的2个字节验证码,不希望读超出
  89.             }
  90.         }
  91.     }
  92.     return 0;
  93. }
  94. 执行结果是这样的:
  95. slen: 3, buf addr: 0xb7fba1c0, buf: <12
  96. slen: 6, buf addr: 0xb7fba1c0, buf: 3   s345
  97. slen: 9, buf addr: 0xb7fba1c0, buf: 3   sF45abc
  98. slen: 12, buf addr: 0xb7fba1c0, buf: 3  sF45abcde>
  99. slen: 14, buf addr: 0xb7fba1c0, buf: 3  sF45abcde>z▒
复制代码

发送的字符串是<12345abcde>,最后面加了两个字节的crc,前面几位老是会被破坏,后面的没有问题

[ 本帖最后由 chenjn 于 2007-6-15 22:23 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP