C语言封装获取本机IP地址的程序

2024-06-24 03:36

本文主要是介绍C语言封装获取本机IP地址的程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 0.概要
    • 1. 设计
    • 2. 完整的代码
      • `ip_address.h`
      • `ip_address.c`
      • `main.c`
      • 编译命令
      • 执行结果

0.概要

本文介绍用C语言编写一个函数来获取本机的IP地址。

1. 设计

将获取IP地址的逻辑封装到一个独立的函数中,并定义一个结构体来存储IP地址和接口名称。
将获取IP地址的逻辑封装到一个函数中,该函数遍历本机的所有网络接口并获取其IP地址.

2. 完整的代码

完整的代码如下:

ip_address.h

#ifndef IP_ADDRESS_H
#define IP_ADDRESS_H#include <netinet/in.h>
#include <net/if.h>#define MAX_IP_ADDRESSES 50
#define INET6_ADDRSTRLEN 46typedef struct {char ifa_name[IFNAMSIZ];char ip_address[INET6_ADDRSTRLEN];int family;
} IPAddress;int get_ip_addresses(IPAddress *ip_addresses, int max_addresses);#endif // IP_ADDRESS_H

ip_address.c

#include "ip_address.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ifaddrs.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>int get_ip_addresses(IPAddress *ip_addresses, int max_addresses) {struct ifaddrs *ifAddrStruct = NULL;struct ifaddrs *ifa = NULL;void *tmpAddrPtr = NULL;int count = 0;if (getifaddrs(&ifAddrStruct) == -1) {/* Error handling */return -1;}for (ifa = ifAddrStruct; ifa != NULL && count < max_addresses; ifa = ifa->ifa_next) {if (ifa->ifa_addr == NULL) {continue;}int family = ifa->ifa_addr->sa_family;if (family == AF_INET) {tmpAddrPtr = &((struct sockaddr_in *)(ifa->ifa_addr))->sin_addr;if (inet_ntop(AF_INET, tmpAddrPtr, ip_addresses[count].ip_address, INET_ADDRSTRLEN) != NULL) {strncpy(ip_addresses[count].ifa_name, ifa->ifa_name, IFNAMSIZ);ip_addresses[count].family = AF_INET;count++;}} else if (family == AF_INET6) {tmpAddrPtr = &((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_addr;if (inet_ntop(AF_INET6, tmpAddrPtr, ip_addresses[count].ip_address, INET6_ADDRSTRLEN) != NULL) {strncpy(ip_addresses[count].ifa_name, ifa->ifa_name, IFNAMSIZ);ip_addresses[count].family = AF_INET6;count++;}} else {/* Do nothing */}}freeifaddrs(ifAddrStruct);return count;
}

main.c

#include <stdio.h>
#include "ip_address.h"int main(void) {IPAddress ip_addresses[MAX_IP_ADDRESSES];int count = get_ip_addresses(ip_addresses, MAX_IP_ADDRESSES);if (count == -1) {fprintf(stderr, "Failed to get IP addresses.\n");return 1;}for (int i = 0; i < count; i++) {if (ip_addresses[i].family == AF_INET) {printf("%s IPv4 Address: %s\n", ip_addresses[i].ifa_name, ip_addresses[i].ip_address);} else if (ip_addresses[i].family == AF_INET6) {printf("%s IPv6 Address: %s\n", ip_addresses[i].ifa_name, ip_addresses[i].ip_address);}}return 0;
}

编译命令

gcc -o ip_address main.c ip_address.c

执行结果

test@t:~/ip_address$ ./ip_address 
lo IPv4 Address: 127.0.0.1
ens33 IPv4 Address: 192.168.1.10
lo IPv6 Address: ::1
ens33 IPv6 Address: 2409:8a20:4e3c:d460:20c:29ff:feb3:d386
ens33 IPv6 Address: fe80::20c:29ff:feb3:d386

通过上述步骤,你将能够获取并打印本机的所有IPv4和IPv6地址。

这篇关于C语言封装获取本机IP地址的程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089058

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据