首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C编程:检查IP地址是否添加到任何给定的NIC上。

问C编程:检查IP地址是否添加到任何给定的NIC上。
EN

Stack Overflow用户
提问于 2015-07-30 19:46:08
回答 4查看 1.4K关注 0票数 0

问题描述:我有一个IP地址(可以是IP 4/IP 6)和NIC地址,如何使用C检查IP地址是否添加到给定的NIC(或任何NIC)中。

我知道在命令行/使用脚本上这样做很简单,但是我需要在C程序中检查同样的代码。

示例:

IP - 192.168.0.1

NIC - eth0

使用命令行(linux平台),下面的命令将告诉我是否添加了IP:

代码语言:javascript
复制
ip addr show | grep "192.168.0.1"

有什么图书馆功能可以用来获得类似的输出吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-10-08 14:21:59

上述方法(GETIFADDRS)对所述问题的描述是正确的。起义者浏览了NIC上所有的IP。

但是,在我的例子中,在NIC /系统中添加了许多IP地址,我可以知道IP是否存在于任何一个NIC中。我找到了一个更简单/更快的解决方案。

要检查IP是否添加到机器的任何NIC卡上,只需打开TCP并绑定到port=zero(0)和要检查的IP地址。成功的绑定将表明IP是可用的/存在的。

注意:如果IP被添加到系统中的任何网卡上,这是有效的。应该使用端口零而不是硬编码,因为它选择系统中的任何可用端口(ref )。http://compnetworking.about.com/od/tcpip/p/port-numbers-0.htm)

该方法已在UNIX环境下对IPv6 4/IPv6 6进行了测试。

PS:验证IP是否存在后,不要忘记关闭套接字。

票数 0
EN

Stack Overflow用户

发布于 2015-07-30 19:55:47

您希望使用getifaddrs,它返回网络接口及其关联地址的列表。

从手册页:

代码语言:javascript
复制
int getifaddrs(struct ifaddrs **ifap);

getifaddrs()函数创建描述本地系统网络接口的结构链接列表,并将列表的第一项的地址存储在*ifap中。该列表由ifaddrs结构组成,定义如下:

代码语言:javascript
复制
       struct ifaddrs {
           struct ifaddrs  *ifa_next;    /* Next item in list */
           char            *ifa_name;    /* Name of interface */
           unsigned int     ifa_flags;   /* Flags from SIOCGIFFLAGS */
           struct sockaddr *ifa_addr;    /* Address of interface */
           struct sockaddr *ifa_netmask; /* Netmask of interface */
           union {
               struct sockaddr *ifu_broadaddr;
                                /* Broadcast address of interface */
               struct sockaddr *ifu_dstaddr;
                                /* Point-to-point destination address */
           } ifa_ifu;
       #define              ifa_broadaddr ifa_ifu.ifu_broadaddr
       #define              ifa_dstaddr   ifa_ifu.ifu_dstaddr
           void            *ifa_data;    /* Address-specific data */
       };

下面是我如何在我的一个程序中使用它的例子:

代码语言:javascript
复制
union sockaddr_u {
    struct sockaddr_storage ss;
    struct sockaddr_in sin;
    struct sockaddr_in6 sin6;
};

struct iflist {
    char name[IFNAME_LEN];
    union sockaddr_u su;
    int isloopback;
    int ismulti;
    int ifidx;
};

void getiflist(struct iflist *list, int *len)
{
    struct ifaddrs *ifa, *ifa_tmp;
    int count;
    unsigned ifidx;

    if (getifaddrs(&ifa) == -1) {
        perror("getifaddrs failed");
        *len = 0;
        return;
    }
    ifa_tmp = ifa;
    count = *len;
    *len = 0;
    while (ifa_tmp && (*len < count)) {
        if ((ifidx = if_nametoindex(ifa_tmp->ifa_name)) == 0) {
            perror("Error getting interface index for interface %s",
                              ifa_tmp->ifa_name);
            continue;
        }
        if (ifa_tmp->ifa_addr && ((ifa_tmp->ifa_addr->sa_family == AF_INET) ||
                                  (ifa_tmp->ifa_addr->sa_family == AF_INET6)) &&
                    ((ifa_tmp->ifa_flags & IFF_UP) != 0)) {
            memset(&list[*len], 0, sizeof(struct iflist));
            strncpy(list[*len].name, ifa_tmp->ifa_name,
                    sizeof(list[*len].name) - 1);
            memcpy(&list[*len].su, ifa_tmp->ifa_addr,
                    sizeof(struct sockaddr_storage));
            list[*len].isloopback = (ifa_tmp->ifa_flags & IFF_LOOPBACK) != 0;
            list[*len].ismulti = (ifa_tmp->ifa_flags & IFF_MULTICAST) != 0;
            list[*len].ifidx = ifidx;
            (*len)++;
        }
        ifa_tmp = ifa_tmp->ifa_next;
    }
    freeifaddrs(ifa);
}
票数 0
EN

Stack Overflow用户

发布于 2015-07-30 19:56:32

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31732726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档