免费注册 查看新帖 |

Chinaunix

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

关于如何实现数据的转换? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-07 12:17 |只看该作者 |倒序浏览
*分解IPv6字符串为数组*/
static int
SIPFW_ParseCommand(int argc, char *argv[],         struct sipfw_cmd_opts *cmd_opt)
{

        struct option longopts[] =
        {                                                /*长选项*/
                {"source",        required_argument,         NULL,        's'},        /*源主机IP地址*/
                {"dest",                required_argument,         NULL,        'd'},        /*目的主机IP地址*/
                {"sport",                required_argument,         NULL,        'm'},        /*源端口地址*/
                {"dport",               required_argument,         NULL,        'n'},        /*目的端口地址*/
                {"protocol",         required_argument,         NULL,        'p'},        /*协议类型*/
                {"list",                    optional_argument,         NULL,        'L'},        /*规则列表*/
                {"flush",                optional_argument,         NULL,        'F'},        /*清空规则*/
                {"append",         required_argument,         NULL,        'A'},        /*增加规则到链尾部*/
                {"interface",          required_argument,         NULL,        'i'},        /*网络接口*/
                {"action",          required_argument,         NULL,        'j'},        /*动作*/
                {"s6addr",      required_argument,      NULL,       'v'},
                {"d6addr",      required_argument,      NULL,       'w'},
                {0, 0, 0, 0},
        };
        static char opts_short[] =  "s:d:m:n:p:LFA:i:j:u:v:w:";        /*短选项*/

        static char *l_opt_arg = NULL;/*产选项的参数*/
                        
        char c = 0;
        while ((c = getopt_long(argc, argv, opts_short,  longopts, NULL)) != -1)
        {
                switch(c)
                {
case 's':                /*源主机IP地址*/
                                l_opt_arg = optarg;
                                if(l_opt_arg && l_opt_arg[0]!=':')
                                {
        SIPFW_ParseOpt(SIPFW_OPT_IP, optarg, &cmd_opt->source);
                                }
                                
                                break;
case 'd':/*目的主机IP地址*/
                                l_opt_arg = optarg;
                                if(l_opt_arg && l_opt_arg[0]!=':')
                                                                {
                                            SIPFW_ParseOpt(SIPFW_OPT_IP, optarg, &cmd_opt->dest);
                                }
                                
                                break;
case 'm':/*源端口地址*/
                                l_opt_arg = optarg;
                                if(l_opt_arg && l_opt_arg[0]!=':')
                                {
                SIPFW_ParseOpt(SIPFW_OPT_PORT, optarg, &cmd_opt->sport);
                                }
                                
                                break;
case 'j':.......................................................................
                    .......................................................................                        
case 'v':
                     l_opt_arg = optarg;
                     if(l_opt_arg && l_opt_arg[0]!=':')
               {
                                   if(optarg)
                                    {
                                     char *v6addr[16]; char* p=":"; char *token;   int i;
                                     token=strtok(optarg,p);
                                      while(token)
                                       { v6addr[i++]=token;
                                           token=strtok(NULL,p);  }
                                     for(i=0; i<16;i++)
                                      {
                                      cmd_opt->s6addr.s6_addr[i]=v6addr[i];
                                      }
                                   }
                                }
                         break;
case 'w': .................................
                     

break;

                                
                        default:
                                break;
                }
        }


}

代码中s6addr的定义为 struct  in6_addr s6addr。这是IPv6地址的定义格式,而v6addr[16]是通过分解一串20,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01得到的一个数组,我想通过in6_addr.s6_addr[i]=v6addr[i]这个方式,直接把这个输入的字符串转换成IPv6地址,但是这个方法好像行不通,不知道有没有什么办法,把v6addr中的字符串的值直接输入到16进制的地址格式中。帮帮忙啊 ?
主要是在for(i=0; i<16;i++)
                                      {
                                      cmd_opt->s6addr.s6_addr[i]=v6addr[i];
                                      }
这里的问题比较大?

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2010-12-07 12:37 |只看该作者
看得比较晕,参考一下内核的实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP