wuwenhua 发表于 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!=':')
                              {
      SIPFW_ParseOpt(SIPFW_OPT_IP, optarg, &cmd_opt->source);
                              }
                              
                              break;
case 'd':/*目的主机IP地址*/
                              l_opt_arg = optarg;
                              if(l_opt_arg && l_opt_arg!=':')
                                                                {
                                          SIPFW_ParseOpt(SIPFW_OPT_IP, optarg, &cmd_opt->dest);
                              }
                              
                              break;
case 'm':/*源端口地址*/
                              l_opt_arg = optarg;
                              if(l_opt_arg && l_opt_arg!=':')
                              {
                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!=':')
               {
                                 if(optarg)
                                    {
                                     char *v6addr; char* p=":"; char *token;   int i;
                                     token=strtok(optarg,p);
                                    while(token)
                                       { v6addr=token;
                                           token=strtok(NULL,p);}
                                     for(i=0; i<16;i++)
                                    {
                                    cmd_opt->s6addr.s6_addr=v6addr;
                                    }
                                 }
                              }
                         break;
case 'w': .................................
                     

break;

                              
                        default:
                              break;
                }
      }


}

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

dreamice 发表于 2010-12-07 12:37

看得比较晕,参考一下内核的实现
页: [1]
查看完整版本: 关于如何实现数据的转换?