问题描述:我有一个IP地址(可以是IP 4/IP 6)和NIC地址,如何使用C检查IP地址是否添加到给定的NIC(或任何NIC)中。
我知道在命令行/使用脚本上这样做很简单,但是我需要在C程序中检查同样的代码。
示例:
IP - 192.168.0.1
NIC - eth0
使用命令行(linux平台),下面的命令将告诉我是否添加了IP:
ip addr show | grep "192.168.0.1"有什么图书馆功能可以用来获得类似的输出吗?
发布于 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是否存在后,不要忘记关闭套接字。
发布于 2015-07-30 19:55:47
您希望使用getifaddrs,它返回网络接口及其关联地址的列表。
从手册页:
int getifaddrs(struct ifaddrs **ifap);
getifaddrs()函数创建描述本地系统网络接口的结构链接列表,并将列表的第一项的地址存储在*ifap中。该列表由ifaddrs结构组成,定义如下:
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 */
};下面是我如何在我的一个程序中使用它的例子:
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);
}发布于 2015-07-30 19:56:32
您可能想使用GETIFADDRS http://man7.org/linux/man-pages/man3/getifaddrs.3.html
https://stackoverflow.com/questions/31732726
复制相似问题