21xrx.com
2024-11-05 18:49:22 Tuesday
登录
文章检索 我的文章 写文章
"C++获取本机IP的几种方法"
2023-07-05 07:22:50 深夜i     --     --
C++ 获取 本机IP 方法 几种

获取本机IP是编程中经常需要用到的操作之一,特别是在网络编程中。而对于C++语言的开发者来说,获取本机IP的操作也相对较为简单。本文将介绍C++获取本机IP的几种方法。

方法一:使用system函数调用ipconfig命令

在Windows操作系统下,可以通过调用ipconfig命令获取本机IP。C++可以使用system函数来调用ipconfig命令,并通过流读取该命令的输出信息。实现代码如下:


#include <iostream>

#include <string>

#include <cstdlib>

#include <cstdio>

using namespace std;

int main() {

  string cmd = "ipconfig";

  string info = "";

  char buffer[128];

  FILE* pipe = _popen(cmd.c_str(), "r");

  if (!pipe)

    cout << "Error: Failed to execute command!" << endl;

    return 1;

  

  while (fgets(buffer, sizeof(buffer), pipe) != NULL) {

    info += buffer;

  }

  _pclose(pipe);

  cout << info << endl;

  return 0;

}

方法二:使用gethostname和gethostbyname函数

在Windows和Linux等多个操作系统下,可以使用gethostname和gethostbyname函数获取本机IP。gethostname函数用于获取本机主机名,而gethostbyname函数用于根据主机名获取主机的IP地址。实现代码如下:


#ifdef _WIN32

#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

#else

#include <sys/socket.h>

#include <arpa/inet.h>

#include <netdb.h>

#endif

#include <iostream>

#include <string>

using namespace std;

int main() {

  string hostname = "";

  char buffer[128];

#ifdef _WIN32

  WSADATA wsaData;

  int res = WSAStartup(MAKEWORD(2, 2), &wsaData);

  if (res != 0)

    cout << "Error: Failed to start up Windows Sockets!" << endl;

    return 1;

  

  res = gethostname(buffer, sizeof(buffer));

#else

  int res = gethostname(buffer, sizeof(buffer));

#endif

  if (res != 0)

    cout << "Error: Failed to get host name!" << endl;

    return 1;

  

  hostname = buffer;

#ifdef _WIN32

  hostent* host = gethostbyname(hostname.c_str());

#else

  struct hostent* host = gethostbyname(hostname.c_str());

#endif

  if (host == NULL)

    cout << "Error: Failed to get host information!" << endl;

    return 1;

  

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

    struct in_addr addr;

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

    cout << inet_ntoa(addr) << endl;

  }

#ifdef _WIN32

  WSACleanup();

#endif

  return 0;

}

方法三:使用Boost库

Boost是C++语言的一个跨平台、开源的类库,提供了大量的工具和组件,包括获取本机IP的工具。C++可以使用Boost库中的asio模块来获取本机IP。实现代码如下:


#include <boost/asio.hpp>

#include <iostream>

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 iter = resolver.resolve(query);

  ip::tcp::endpoint endpoint = *iter;

  cout << endpoint.address().to_string() << endl;

  return 0;

}

通过以上三种方法,C++开发者均可以轻松地获取本机IP,方便网络编程等操作。

  
  

评论区

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