linux cat获取ip,linux下获取本机IPv6地址、前缀、网关

#include #define PROCNET_ROUTE_PATH"/proc/net/route"

#define PROCNET_IFINET6_PATH"/proc/net/if_inet6"

#define SCOPE_LINK_STR"fe80"

int net_get_ipv6_ifaddr(char type, const char *ifname, char *addr, int length, char *prefix, int length2)

{

int ret = 0;

FILE *fp;

char addr6[46] = {0}, dev_name[20] = {0};

char addr6p[8][5];

int length_of_prefix, scope_value, if_flags, if_index;

struct sockaddr_in6 sap = {0};

if (!ifname || !addr || length <= 0 || !prefix || length2 <= 0)

return -1;

fp = fopen(PROCNET_IFINET6_PATH, "r");

if (!fp) return -1;

lockf(fileno(fp), F_LOCK, 0);

while (fscanf(fp, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %20s\n",

addr6p[0], addr6p[1], addr6p[2], addr6p[3],

addr6p[4], addr6p[5], addr6p[6], addr6p[7],

&if_index, &length_of_prefix, &scope_value, &if_flags, dev_name) != EOF) {

if (!strcmp(dev_name, ifname)) {

sprintf(addr6, "%s:%s:%s:%s:%s:%s:%s:%s",

addr6p[0], addr6p[1], addr6p[2], addr6p[3],

addr6p[4], addr6p[5], addr6p[6], addr6p[7]);

if (strncmp(addr6p[0], SCOPE_LINK_STR, strlen(SCOPE_LINK_STR)) == 0) {

//fe80 Scope:Link

if (type == 1) {

inet_pton(AF_INET6, addr6, &sap.sin6_addr);

inet_ntop(AF_INET6, &sap.sin6_addr, addr, length);

snprintf(prefix, length2, "%d", length_of_prefix);

lockf(fileno(fp), F_ULOCK, 0);

fclose(fp);

return 0;

}

} else {

//2001 Scope:Global

if (type == 0) {

inet_pton(AF_INET6, addr6, &sap.sin6_addr);

inet_ntop(AF_INET6, &sap.sin6_addr, addr, length);

snprintf(prefix, length2, "%d", length_of_prefix);

lockf(fileno(fp), F_ULOCK, 0);

fclose(fp);

return 0;

}

}

}

}

lockf(fileno(fp), F_ULOCK, 0);

fclose(fp);

return -1;

}

int net_get_ipv6_gateway(char type, const char *ifname, char *gateway, int length)

{

FILE *fp;

char buffer[80] = {'\0'};

char path[128] = {'\0'};

char flag = 0;

char *dfstr = "default via ";

char *p, *q;

if (!ifname || !gateway || length <= 0)

return -1;

//snprintf(path, sizeof(path), "/bin/ip -6 route show dev %s", ifname);

snprintf(path, sizeof(path), "ip -6 route show dev %s", ifname);//hi3798 have not /bin/ip

fp = popen(path, "r");

if (!fp) return -1;

lockf(fileno(fp), F_LOCK, 0);

while (fgets(buffer, sizeof(buffer), fp)) {

if (!strncmp(buffer, dfstr, strlen(dfstr))) {

p = (char *)&buffer[strlen(dfstr)];

if (p) {

q = strchr(p, ' ');

if (q) {

if (type == 1) {

if (strncmp(p, SCOPE_LINK_STR, strlen(SCOPE_LINK_STR)) == 0) {

snprintf(gateway, (int)(q - p + 1), "%s", p);

lockf(fileno(fp), F_ULOCK, 0);

pclose(fp);

return 0;

}

} else {

snprintf(gateway, (int)(q - p + 1), "%s", p);

lockf(fileno(fp), F_ULOCK, 0);

pclose(fp);

return 0;

}

}

}

}

}

lockf(fileno(fp), F_ULOCK, 0);

pclose(fp);

return -1;

}

int net_is_validipv6(const char *hostname)

{

struct sockaddr_in6 addr;

if (!hostname) return -1;

if (strchr(hostname, '.')) return -1;//暂时排除::ffff:204.152.189.116

if (inet_pton(AF_INET6, hostname, &addr.sin6_addr) != 1) return -1;

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值