获取本地eth0 IP - C语言
背景
在编写网络应用程序时,有时需要获取本地主机的IP地址。在Linux系统中,eth0是默认的以太网接口名称。本文将介绍如何使用C语言获取本地eth0网卡的IP地址。
步骤
以下是获取本地eth0 IP的步骤:
- 包含必要的头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
#include <sys/ioctl.h>
- 创建socket
使用socket函数创建一个套接字。
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
- 获取接口信息
使用ioctl函数获取eth0接口的信息。
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ - 1);
if (ioctl(sockfd, SIOCGIFADDR, &ifr) < 0) {
perror("ioctl failed");
exit(EXIT_FAILURE);
}
- 提取IP地址
从接口信息中提取IP地址。
struct sockaddr_in* addr = (struct sockaddr_in*)&ifr.ifr_addr;
char ip_address[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &addr->sin_addr, ip_address, INET_ADDRSTRLEN);
- 打印IP地址
最后,打印获取到的IP地址。
printf("本地eth0 IP地址: %s\n", ip_address);
完整代码示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
#include <sys/ioctl.h>
int main() {
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ - 1);
if (ioctl(sockfd, SIOCGIFADDR, &ifr) < 0) {
perror("ioctl failed");
exit(EXIT_FAILURE);
}
struct sockaddr_in* addr = (struct sockaddr_in*)&ifr.ifr_addr;
char ip_address[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &addr->sin_addr, ip_address, INET_ADDRSTRLEN);
printf("本地eth0 IP地址: %s\n", ip_address);
return 0;
}
总结
通过使用C语言和一些系统调用,我们可以轻松获取本地eth0网卡的IP地址。这对于网络编程和服务器配置非常有用。