c++获取本机ip地址

c实现主要是依赖于两个结构体

struct ifreq {
#define IFHWADDRLEN 6
union
{
char ifrn_name[IFNAMSIZ];/* if name, e.g. "en0" */
} ifr_ifrn;

union {
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
struct sockaddr ifru_netmask;
struct  sockaddr ifru_hwaddr;
short ifru_flags;
int ifru_ivalue;
int ifru_mtu;
struct  ifmap ifru_map;
char ifru_slave[IFNAMSIZ];/* Just fits the size */
char ifru_newname[IFNAMSIZ];
void * ifru_data;
struct if_settings ifru_settings;
} ifr_ifru;
};


struct ifconf  {
int ifc_len;/* size of buffer */
union {
char *ifcu_buf;
struct ifreq *ifcu_req;
} ifc_ifcu;
};
#define ifc_bufifc_ifcu.ifcu_buf /* buffer address*/
#define ifc_reqifc_ifcu.ifcu_req /* array of structures*/

这两个结构体在if.h中

find /usr/include -name "*.h" -exec grep -l "ifconf" {} \; 找到此文件

网友实例:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <signal.h>

#include <sys/ioctl.h>
#include <linux/if.h>
#include <iostream>
using namespace std;
const int  MAXINTERFACES=16;
long getlocalhostip(){

	long ip;
	int fd, intrface, retn = 0;
	struct ifreq buf[MAXINTERFACES]; ///if.h
	struct ifconf ifc; ///if.h
	ip = -1;
	if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) >= 0) //socket.h
	{
		ifc.ifc_len = sizeof buf;
		ifc.ifc_buf = (caddr_t) buf;
		if (!ioctl (fd, SIOCGIFCONF, (char *) &ifc)) //ioctl.h
		{
			intrface = ifc.ifc_len / sizeof (struct ifreq); 
			while (intrface-- > 0)
			{
				if (!(ioctl (fd, SIOCGIFADDR, (char *) &buf[intrface])))
				{
					ip=inet_addr( inet_ntoa( ((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr) );//types
					break;
				}
           
			}
		}
		close(fd);
	}
	return ip;
}
union ipu{
	long ip;
	unsigned char ipchar[4];
};

int main(int argc, char **argv){
	union ipu iptest;
	iptest.ip = getlocalhostip();
	printf("local ip:%x :%3u.%3u.%3u.%3u \n",iptest.ip, iptest.ipchar[0],iptest.ipchar[1],iptest.ipchar[2],iptest.ipchar[3]);
	return 0;
}

实例二:

include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <arpa/inet.h>
#include <errno.h>
#include <iostream>
#include <string.h>
using namespace std;

int getlocalip(char *localip);
int main()  
{          

    char localip[30];
	getlocalip(localip);
	cout << localip << endl;
	return 0;
}

int getlocalip(char *localip)
{
	const char* eth0="eth0";
	int sock;
	struct sockaddr_in sin;          
	struct ifreq ifr;
	sock = socket(AF_INET, SOCK_DGRAM, 0);
	if (sock == -1){
		perror("socket");
		return -1;
	}
	strncpy(ifr.ifr_name, eth0, IFNAMSIZ);
	ifr.ifr_name[IFNAMSIZ - 1] = 0;
	if (ioctl(sock, SIOCGIFADDR, &ifr) < 0){
		perror("ioctl");
		return -1;
	}
	memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
	strcpy(localip ,inet_ntoa(sin.sin_addr));
}

实例三:

int getlocalip(char* outip)
{
int i=0;
int sockfd;
struct ifconf ifconf;
char buf[512];
struct ifreq *ifreq;
char* ip;
//初始化ifconf
ifconf.ifc_len = 512;
ifconf.ifc_buf = buf;
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0)
{
return -1;
}
ioctl(sockfd, SIOCGIFCONF, &ifconf);    //获取所有接口信息
close(sockfd);
//接下来一个一个的获取IP地址
ifreq = (struct ifreq*)buf;
for(i=(ifconf.ifc_len/sizeof(struct ifreq)); i>0; i–)
{
ip = inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr);
if(strcmp(ip,”127.0.0.1″)==0)  //排除127.0.0.1,继续下一个
{
ifreq++;
continue;
}
strcpy(outip,ip);
return 0;
}
return -1;
}

实例四, 使用shell获取本机IP

string GetLocalIpAddress()
{
    FILE *fp = NULL;
    char buff[256];
    string strIP = "N/A";
    int i;

    if(0 == system("ifconfig | grep 'Bcast'| tr -s ' ' : | cut -d: -f4 > /tmp/ip.lst"))
    {
        fp = fopen("/tmp/ip.lst", "rt");
        if(fp)
        {
            if(fgets(buff, 256, fp) > 0)
            {
                for(i = strlen(buff) - 1; i >= 0; i--)
                {
                    if(buff[i] != '\x0A' && buff[i] != '\x0D')
                    {
                        buff[i + 1] = '\0';
                        break;
                    }
                }
                strIP = buff;
            }
            fclose(fp);
        }
    }

    return strIP;
}

或者:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char *argv[])
{
	const char* shellstr = "ifconfig | sed -n '2p' | awk -F'[ :]+' '{printf $4}'";
    FILE *fp = popen(shellstr, "r");
	char line[20];
	memset(line, 0, sizeof(line));
    fgets(line, 20, fp);
	puts(line);
	
    return 0;
}


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用C++编程语言通过以下方式获取本地IP地址: ```cpp #include <iostream> #include <string> #include <cstring> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main() { int socket_fd = socket(AF_INET, SOCK_DGRAM, 0); if (socket_fd == -1) { std::cerr << "Failed to create socket" << std::endl; return 1; } sockaddr_in sa; std::memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_addr.s_addr = inet_addr("8.8.8.8"); // 使用一个公共的IP地址作为目标,如Google DNS服务器地址 int connect_result = connect(socket_fd, reinterpret_cast<const sockaddr*>(&sa), sizeof(sa)); if (connect_result == -1) { std::cerr << "Failed to connect" << std::endl; close(socket_fd); return 1; } sockaddr_in local_addr; socklen_t addr_len = sizeof(local_addr); int getsockname_result = getsockname(socket_fd, reinterpret_cast<sockaddr*>(&local_addr), &addr_len); if (getsockname_result == -1) { std::cerr << "Failed to get local address" << std::endl; close(socket_fd); return 1; } char ip_addr[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &(local_addr.sin_addr), ip_addr, INET_ADDRSTRLEN); std::cout << "Local IP address: " << ip_addr << std::endl; close(socket_fd); return 0; } ``` 这段代码使用了`socket`、`connect`和`getsockname`函数来获取本地IP地址。它创建了一个UDP套接字,并通过连接到一个公共IP地址(如Google DNS服务器地址)来获取本地IP地址。然后使用`getsockname`函数获取套接字的本地地址,最后使用`inet_ntop`函数将二进制IP地址转换为字符串形式。在此示例中,我们使用了Google DNS服务器地址,你可以根据需要更改为其他可访问的IP地址。 请注意,这种方法仅适用于已连接到网络的设备。如果设备没有连接到网络,将无法获取IP地址。此外,代码中没有处理错误情况的详细信息,你可以根据需要进行错误处理和异常情况处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值