如何在C语言中获取Linux系统的网卡IP地址?

在 Linux 中,你可以使用命令 ip addr showifconfig 来获取网卡的 IP 地址。

在Linux操作系统中,获取网卡的IP地址是一项常见且重要的任务,通过C语言编程,可以使用系统调用和库函数来实现这一目标,以下是详细的步骤和示例代码:

如何在C语言中获取Linux系统的网卡IP地址?

使用`ioctl`函数获取网卡信息

ioctl函数是Linux系统中用于设备控制的重要系统调用之一,可以通过它获取网络接口的各种信息,包括IP地址、MAC地址等,以下是一个使用ioctl函数获取网卡信息的完整示例:

#include <stdio.h>
#include <string.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <errno.h>
int getLocalInfo(void)
{
    int fd;
    int interfaceNum = 0;
    struct ifreq buf[16];
    struct ifconf ifc;
    struct ifreq ifrcopy;
    char mac[16] = {0};
    char ip[32] = {0};
    char broadAddr[32] = {0};
    char subnetMask[32] = {0};
    if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        perror("socket");
        close(fd);
        return -1;
    }
    ifc.ifc_len = sizeof(buf);
    ifc.ifc_buf = (caddr_t)buf;
    if (!ioctl(fd, SIOCGIFCONF, (char *)&ifc))
    {
        interfaceNum = ifc.ifc_len / sizeof(struct ifreq);
        printf("interface num = %dn", interfaceNum);
        while (interfaceNum-> 0)
        {
            printf("ndevice name: %sn", buf[interfaceNum].ifr_name);
            // ignore the interface that not up or not running
            ifrcopy = buf[interfaceNum];
            if (ioctl(fd, SIOCGIFFLAGS, &ifrcopy))
            {
                printf("ioctl: %s [%s:%d]n", strerror(errno), __FILE__, __LINE__);
                close(fd);
                return -1;
            }
            // get the mac of this interface
            if (!ioctl(fd, SIOCGIFHWADDR, (char *)(&buf[interfaceNum]))
            {
                memset(mac, 0, sizeof(mac));
                snprintf(mac, sizeof(mac), "%02x%02x%02x%02x%02x%02x",
                    (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[0],
                    (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[1],
                    (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[2],
                    (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[3],
                    (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[4],
                    (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[5]);
                printf("device mac: %sn", mac);
            } else
            {
                printf("ioctl: %s [%s:%d]n", strerror(errno), __FILE__, __LINE__);
                close(fd);
                return -1;
            }
            // get the IP of this interface
            if (!ioctl(fd, SIOCGIFADDR, (char *)&buf[interfaceNum]))
            {
                snprintf(ip, sizeof(ip), "%s",
                    (char *)inet_ntoa(((struct sockaddr_in *)&(buf[interfaceNum].ifr_addr))->sin_addr));
                printf("device ip: %sn", ip);
            } else
            {
                printf("ioctl: %s [%s:%d]n", strerror(errno), __FILE__, __LINE__);
                close(fd);
                return -1;
            }
        }
    } else
    {
        printf("ioctl: %s [%s:%d]n", strerror(errno), __FILE__, __LINE__);
        close(fd);
        return -1;
    }
    close(fd);
    return 0;
}

2. 使用getifaddrs函数获取网卡信息

getifaddrs函数可以获取所有网络接口的信息,并存储在链表中,以下是一个使用getifaddrs函数获取网卡信息的完整示例:

#include <stdio.h>
#include <string.h>
#include <ifaddrs.h>
#include <arpa/inet.h>
#include <errno.h>
int main() {
    struct ifaddrs *ifaddr, *ifa;
    int family, s;
    char host[NI_MAXHOST];
    if (getifaddrs(&ifaddr) == -1) {
        perror("getifaddrs");
        return -1;
    }
    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 || family == AF_INET6) {
            s = getnameinfo(ifa->ifa_addr,
                           (family == AF_INET) ? sizeof(struct sockaddr_in) :
                           sizeof(struct sockaddr_in6),
                           host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
            if (s != 0) {
                printf("getnameinfo() failed: %s
", gai_strerror(s));
                break;
            }
            printf("%s
", host);
        }
    }
    freeifaddrs(ifaddr);
    return 0;
}

使用`ip`命令获取网卡信息

虽然ip命令通常在shell中使用,但也可以通过C语言调用系统命令来执行,以下是一个使用system函数调用ip命令获取网卡信息的示例:

如何在C语言中获取Linux系统的网卡IP地址?

#include <stdio.h>
#include <stdlib.h>
int main() {
    system("ip addr show");
    return 0;
}

方法均可用于获取Linux系统中网卡的IP地址和其他相关信息,选择哪种方法取决于具体的需求和使用场景:

ioctl函数适合需要详细控制和高效性能的场景。

getifaddrs函数提供了更高层次的API,使用起来更加方便。

ip命令适用于简单的脚本或临时调试。

如何在C语言中获取Linux系统的网卡IP地址?

在选择方法时,应考虑程序的可移植性、性能要求以及开发和维护的便捷性。

原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1488795.html

本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。

(0)
未希
上一篇 2025-01-14 22:25
下一篇 2025-01-14 22:26

相关推荐

  • 如何在C中添加文字水印?请提供相关代码示例。

    当然,以下是一个使用 C# 添加文字水印的示例代码:,,“csharp,using System.Drawing;,using System.Drawing.Imaging;,,public class Watermark,{, public static void AddTextWatermark(string inputImagePath, string outputImagePath, string watermarkText), {, using (Image image = Image.FromFile(inputImagePath)), {, int width = image.Width;, int height = image.Height;,, using (Graphics graphics = Graphics.FromImage(image)), {, Font font = new Font(“Arial”, 20, FontStyle.Bold);, SolidBrush brush = new SolidBrush(Color.FromArgb(128, Color.White));, SizeF textSize = graphics.MeasureString(watermarkText, font);,, float x = (width textSize.Width) / 2;, float y = (height textSize.Height) / 2;,, graphics.DrawString(watermarkText, font, brush, x, y);, },, image.Save(outputImagePath, ImageFormat.Jpeg);, }, },},`,,这个类包含一个静态方法 AddTextWatermark`,它接受输入图像路径、输出图像路径和水印文本作为参数。该方法在图像中心添加指定文本的水印并保存结果图像。

    2025-01-14
    06
  • 如何在服务器上编写C语言代码?

    编写服务器端的C语言代码通常需要使用网络编程库,如POSIX套接字或Windows Sockets API。以下是一个简单的例子:,,“c,#include,#include,#include,#include,#include ,#include,#include,,void error(const char *msg) {, perror(msg);, exit(1);,},,int main(int argc, char *argv[]) {, int sockfd, newsockfd, portno;, socklen_t clilen;, char buffer[256];, struct sockaddr_in serv_addr, cli_addr;, int n;,, if (argc˂ 2) {, fprintf(stderr,”ERROR, no port provided,”);, exit(1);, }, sockfd = socket(AF_INET, SOCK_STREAM, 0);, if (sockfd˂ 0) , error(“ERROR opening socket”);, bzero((char *) &serv_addr, sizeof(serv_addr));, portno = atoi(argv[1]);, serv_addr.sin_family = AF_INET;, serv_addr.sin_addr.s_addr = INADDR_ANY;, serv_addr.sin_port = htons(portno);, if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr))˂ 0) , error(“ERROR on binding”);, listen(sockfd,5);, clilen = sizeof(cli_addr);, newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);, if (newsockfd˂ 0) , error(“ERROR on accept”);, bzero(buffer,256);, n = read(newsockfd,buffer,255);, if (n˂ 0) error(“ERROR reading from socket”);, printf(“Here is the message: %s,”,buffer);, n = write(newsockfd,”I got your message”,18);, if (n˂ 0) error(“ERROR writing to socket”);, close(newsockfd);, close(sockfd);, return 0; ,},“

    2025-01-14
    06
  • 如何实现C语言对远程SQL数据库的连接?

    要在C语言中实现远程SQL数据库连接,可以使用MySQL Connector/C库。首先安装该库,然后使用mysql_init、mysql_real_connect函数建立连接,通过mysql_query执行SQL语句,最后用mysql_close关闭连接。

    2025-01-14
    06
  • C语言服务器如何获取客户端IP地址?

    在服务器端获取客户端的IP地址,可以通过检查HTTP请求头中的X-Forwarded-For字段或直接从网络连接中提取。

    2025-01-14
    00

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

产品购买 QQ咨询 微信咨询 SEO优化
分享本页
返回顶部
云产品限时秒杀。精选云产品高防服务器,20M大带宽限量抢购 >>点击进入