首页 > 系统相关 >linux C语言 使用socket获取本机所有IP地址

linux C语言 使用socket获取本机所有IP地址

时间:2023-06-19 17:55:17浏览次数:39  
标签:ifc socket ifr int ip linux num IP地址 buf

#include <stdio.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <arpa/inet.h>

/*****************************************************
 *  函数功能:获取本机所有ip地址。
 *  输入参数:
 *      max_ip_num: ip_buf能存的最多ip个数;
 *  输出参数:
 *      ip_buf[][]: 本机的ip地址以字符串形式依次存放于ip_buf[0] ip_buf[1]...
 *  返回值:
 *      获取到ip地址的个数。
 ******************************************************/
int get_local_ip(char (*ip_buf)[20], int max_ip_num)
{
    int i = 0;
    int sockfd;
    struct ifconf ifc;
    char buf[1024] = {0};
    char ipbuf[20] = {0};
    struct ifreq *ifr;

    ifc.ifc_len = 1024;
    ifc.ifc_buf = buf;

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        return -1;
    }
    ioctl(sockfd, SIOCGIFCONF, &ifc);
    ifr = (struct  ifreq*)buf;

    int num = 0;
    for (i = (ifc.ifc_len/sizeof(struct ifreq)); i > 0; i--) {
        // printf("net name: %s\n", ifr->ifr_name);
        inet_ntop(AF_INET, &((struct sockaddr_in*)&ifr->ifr_addr)->sin_addr, ip_buf[num++], 20);
        // printf("ip: %s\n", ipbuf);
        ifr = ifr + 1;
        if (num >= max_ip_num) {
            break;
        }
    }
    return num;
}

void main()
{
    char ip_buf[10][20] = {0};
    int ip_num = get_local_ip(ip_buf, 10);
    printf("ip_num:%d\n", ip_num);

    if (ip_num > 0) {
        int i = 0;
        for (i = 0; i < ip_num; i++) {
            printf("ip[%d]:%s\n", i, ip_buf[i]);
        }
    }
}

 

标签:ifc,socket,ifr,int,ip,linux,num,IP地址,buf
From: https://www.cnblogs.com/sanshigoodgoodstudy/p/17491790.html

相关文章

  • Linux 常用命令
    一、Linux命令格式command[-options][parameter]说明:command:命令名[-options]:选项,可用来对命令进行控制,也可以省略[parameter]:传给命令的参数,可以是零个、一个或者多个注意:[]代表可选命令名、选项、参数之间有空......
  • 前端WebSocket 封装
    前言实际工作中可能会遇到需要封装WebSocket的场景,以下基于ts做了WebSocket的封装,包括心跳机制和重连1、封装逻辑如下,新建ws文件://websocket封装enumConnectionState{//websocket连接状态'CONNECTING','CONNECTED','DISCONNECTED','RECONNECTING','REC......
  • 【解决办法】DHCP Relay环境中PC无法获取IP地址,排错与解法
    环境:工具:锐捷EVE模拟器,VMwareWorkstationPro远程工具:SecureCRT系统版本:Windows10问题描述:描述:在DHCPRelay环境中,中继和服务器能正常互通,但是通过抓包发现,PC客户端发送的报文并没有被正常的转发给DHCP服务器。提示:若按照教程还是无法完成操作,可以进入右侧的......
  • Linux建立虚拟ip的方法
    1、虚拟ip的介绍 虚拟IP地址(VIP)是一个不与特定计算机或一个计算机中的网络接口卡(NIC)相连的IP地址。数据包被发送到这个VIP地址,但是所有的数据还是经过真实的网络接口。上边是百度的定义。就是一块网卡上边有两个ip,然后无论到哪个ip的流量都会经过物理网卡。 2、虚拟i......
  • Linux根据PID查询进场所在目录
    1、查询端口占用情况netstat-tunlp|grep80302、进入任务目录cd/proc/77662#77662为pid3、查询目录ls-ailcmd行指向就是进程所在目录了 ......
  • Linux安装MongoDB 4.0.3
    Linux安装MongoDB4.0.3 1.准备CentOS下安装MongoDB官网提供windows、Linux、OSX系统环境下的安装包,这里主要是记录一下在Linux下的安装。首先到官网下载安装包。文中安装的是4.0.3版本的。官网地址:https://www.mongodb.com/下载地址:https://www.mongodb.com/try/download......
  • 安装Oracle Linux碰见的几个问题
    今儿需要部署一个Oracle环境,为了简单些,选择了Oracle提供的Linux版本介质:OracleLinux-R6-U2-Server-x86_64-dvd.iso,在安装的过程中碰见了几个常见的问题,简要记录下,便于日后查找。问题1:无法登陆图形界面按照正常流程安装后,默认是没有安装图形界面的,因此进入的是命令行界面,若不用静......
  • 非Oracle Linux下安装Oracle 19c
    《Oracle19c之RPM安装》介绍了在OracleLinux平台下安装Oracle19c的过程,其实无论是19c,还是11g,用OracleLinux会为你省不少的事情,毕竟同为Oracle产品,从推广角度看,肯定会相对其他平台提供更多的便利性,例如提前预安装了需要的Package,设置了信号量,创建了各种账号、路径和权限。这次采......
  • Linux 7安装Oracle 11g打怪经历
    最近接到个需求,要将一套开发环境中Linux6平台的Oracle11g,迁移到两套Linux7平台,原以为很简单,但过程中,确实历经坎坷,就像过山车一般,解决这个问题,又碰到下一个。软件信息RedHatLinux7.5Oracle11.2.0.4坑坑坑1.软链接为了安装路径的标准和简便,可以使用软链接,语法如下,ln-s【目标......
  • Linux下的yum怎么升级?
    Linux下我们安装软件,可能会需要安装各种包来支持,你可以从安装介质中找到rpm,手动安装,但最常用的,可能还是yum,省了很多烦恼。但要知道yum同样需要升级,yum怎么升级?碰巧看到杨大师的一篇文章《LINUX环境下如何重建yum源并更新》,介绍了整个操作。1. 备份默认的yum#mv/etc/yum.repos.d......