21xrx.com
2024-11-08 21:11:21 Friday
登录
文章检索 我的文章 写文章
C++如何获取本地IP地址
2023-07-03 04:05:12 深夜i     --     --
C++ 获取 本地IP地址

在使用C++编写应用程序时,有时需要获取本地IP地址,以便进行网络通信或其他操作。本文将介绍如何使用C++获取本地IP地址。

方法一:使用gethostname和gethostbyname函数

gethostname函数可以获取主机名,gethostbyname函数可以通过主机名获取IP地址。

下面是一个示例程序:


#include <iostream>

#include <cstring>

#include <arpa/inet.h>

#include <netdb.h>

using namespace std;

int main() {

  char hostname[128];

  if (gethostname(hostname, sizeof(hostname)) == -1) {

    cerr << "Error: " << strerror(errno) << endl;

    return -1;

  }

  struct hostent* he;

  if ((he = gethostbyname(hostname)) == NULL) {

    cerr << "Error: " << strerror(errno) << endl;

    return -1;

  }

  for (int i = 0; he->h_addr_list[i] != NULL; ++i) {

    struct in_addr addr;

    memcpy(&addr, he->h_addr_list[i], sizeof(struct in_addr));

    cout << inet_ntoa(addr) << endl;

  }

}

方法二:使用ifconfig (或ipconfig)命令

在Unix系统中,可以使用ifconfig命令获取本地IP地址;在Windows系统中,可以使用ipconfig命令。

可以使用popen函数调用ifconfig (或ipconfig)命令,并读取其输出。

下面是一个示例程序:


#include <iostream>

#include <stdio.h>

#include <arpa/inet.h>

using namespace std;

int main() {

  FILE* fp = popen("/sbin/ifconfig | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'", "r");

  if (!fp) {

    cerr << "Error: " << strerror(errno) << endl;

    return -1;

  }

  char buf[128];

  while (fgets(buf, sizeof(buf), fp) != NULL) {

    struct in_addr addr;

    inet_aton(buf, &addr);

    cout << inet_ntoa(addr) << endl;

  }

  pclose(fp);

  return 0;

}

方法三:使用Boost库

Boost是一个C++库,其中包含了很多实用的组件,包括网络编程组件asio。

asio库提供了获取本地IP地址的接口。

下面是一个示例程序:


#include <iostream>

#include <boost/asio.hpp>

using namespace std;

using namespace boost::asio;

int main() {

  io_service io;

  ip::tcp::resolver resolver(io);

  ip::tcp::resolver::query query(host_name(), "");

  ip::tcp::resolver::iterator it = resolver.resolve(query);

  while (it != ip::tcp::resolver::iterator()) {

    cout << it->endpoint().address().to_string() << endl;

    ++it;

  }

  return 0;

}

以上就是使用C++获取本地IP地址的三种方法,选择其中一种即可。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复