免费注册 查看新帖 |

Chinaunix

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

[C] 移植dns-proxy的一段代码,字符转换,偶尔会死掉,就是不知道哪里出错了,请大家帮忙 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-13 15:07 |只看该作者 |倒序浏览
void dns_decode_name(char *name, char **buf)
{
     int i, k, len, j;

     i = k = 0;
     while( **buf )
     {
         len = *(*buf)++;
         if (len <=0)
             break;
   
         for( j = 0; j<len && len<NAME_SIZE; j++)
              name[k++] = *(*buf)++;
         name[k++] = '.';
     }
     //name[k-1] = *(*buf)++;
     (*buf)++;
     if( k > 0 )
     {
           name[k-1] = 0x00;
     }
     else
     {
          name[0] = 0x00;
     }
}

这段代码是dns-proxy里面一段解析DNS域名的代码,一般不会出错,但是偶尔程序会在这里死掉,
就是不知道这段代码哪里写错了,请大侠们赐教

buf为输入: 如 输入字符串为  (3)www(5)baidu(3)com(0), 那么解析后的输出到name里为www.baidu.com,
注意输入里的3表示后面有3个字符,然后就是5,后面有5个字符.

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2012-10-13 15:30 |只看该作者
代码很烂
len = *(*buf)++; 从这一句上是用一个char来保存长度,但char是有符号数还是无符号数是实现定义的
for( j = 0; j<len && len<NAME_SIZE; j++) 一来没必要每次循环都判断,二来达到NAME_SIZE时会增加个点号,怎么看都是个算法bug
(*buf)++; 这个属于设计错误,你这个函数就不应该干这事,接口也可以简化一下

回正题^_^,偶尔死掉,可能是 name的空间不足

论坛徽章:
0
3 [报告]
发表于 2012-10-13 15:35 |只看该作者
忘了这句, NAME_SIZE 是256.
多谢楼上回复,不过dns域名一般不会超过256长度的。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
4 [报告]
发表于 2012-10-13 16:10 |只看该作者
好烂的代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP