关于如何实现数据的转换?
*分解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;
}
这里的问题比较大? 看得比较晕,参考一下内核的实现
页:
[1]