如何使用Linux C编程获取IP地址 (linux c编程 获取ip地址)

在网络编程中,获取本机或远程主机的IP地址是一个很常见的需求。Linux操作系统提供了一系列的接口函数,可以方便地实现这些功能。

1. 获取本机IP地址

在Linux中,获取本机IP地址最“原始”的方法是通过读取系统文件/sys/class/net/eth0/address。这个文件中保存有网卡的MAC地址,通过分析MAC地址可以得到本机的IP地址。不过这种方式比较麻烦,并且只适用于有线网络环境下的情况。

更常用的方法是使用getifaddrs()函数获取本机网络信息。这个函数的之一个参数是一个指向ifaddrs结构体的指针,第二个参数是一个标识IP协议族类型的常量。如果需要获取IPv4地址,可以将第二个参数设置为AF_INET,如果需要获取IPv6地址,则可以将其设置为AF_INET6。以下是一个获取本机IPv4地址的示例代码:

“`

#include

#include

#include

#include

#include

int mn()

{

struct ifaddrs *ifaddr, *ifa;

int family, s;

char host[NI_MAXHOST];

if (getifaddrs(&ifaddr) == -1) {

perror(“getifaddrs”);

exit(EXIT_FLURE);

}

for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {

if (ifa->ifa_addr == NULL)

continue;

family = ifa->ifa_addr->sa_family;

if (family == AF_INET) {

s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);

if (s != 0) {

printf(“getnameinfo() fled: %s”, g_strerror(s));

exit(EXIT_FLURE);

}

printf(“%s: %s\n”, ifa->ifa_name, host);

}

}

freeifaddrs(ifaddr);

exit(EXIT_SUCCESS);

}

“`

这个程序会遍历本机所有的网络接口,并打印出每个接口对应的IP地址。

2. 获取远程主机IP地址

获取远程主机IP地址的方法比较简单。可以使用getaddrinfo()函数将主机名转换成IP地址。这个函数的之一个参数是主机名,第二个参数是服务名,可以为NULL。第三个参数是一个指向Addrinfo结构体的指针,用于返回地址信息。以下是一个获取百度IP地址的示例代码:

“`

#include

#include

#include

int mn(int argc, char *argv[])

{

struct addrinfo hints, *res, *p;

int status;

char ipstr[INET6_ADDRSTRLEN];

if (argc != 2) {

fprintf(stderr,”usage: showip hostname\n”);

return 1;

}

memset(&hints, 0, sizeof hints);

hints._family = AF_UNSPEC; // set to AF_INET to force IPv4

hints._socktype = SOCK_STREAM;

if ((status = getaddrinfo(argv[1], NULL, &hints, &res)) != 0) {

fprintf(stderr, “getaddrinfo: %s\n”, g_strerror(status));

return 2;

}

printf(“IP addresses for %s:\n\n”, argv[1]);

for(p = res;p != NULL; p = p->_next) {

void *addr;

char *ipver;

// get the pointer to the address itself,

// different fields in IPv4 and IPv6:

if (p->_family == AF_INET) { // IPv4

struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->_addr;

addr = &(ipv4->sin_addr);

ipver = “IPv4”;

} else { // IPv6

struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->_addr;

addr = &(ipv6->sin6_addr);

ipver = “IPv6”;

}

// convert the IP to a string and print it:

inet_ntop(p->_family, addr, ipstr, sizeof ipstr);

printf(” %s: %s\n”, ipver, ipstr);

}

freeaddrinfo(res); // free the linked list

return 0;

}

“`

这个程序会将百度的域名“www.bdu.com”转换成对应的IP地址,并打印出来。可以看到,对于IPv4和IPv6两种地址,地址转换的方式是不同的。


数据运维技术 » 如何使用Linux C编程获取IP地址 (linux c编程 获取ip地址)