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

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

webapp地址

F:\LSP\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX