c++获取本机ip(C++获取本机防止多开)

## C++ 获取本机 IP 地址### 简介在网络编程中,获取本机 IP 地址是一项常见需求。C++ 本身并没有提供直接获取 IP 地址的函数,但我们可以借助系统库函数来实现。本文将介绍两种常用的方法,并提供详细的代码示例。### 方法一:利用 `gethostname` 和 `getaddrinfo` 函数1.

获取主机名:

使用 `gethostname` 函数获取本机主机名。 2.

获取地址信息:

使用 `getaddrinfo` 函数根据主机名获取地址信息,包括 IP 地址。 3.

遍历地址信息:

遍历 `getaddrinfo` 返回的地址信息列表,找到第一个 IPv4 地址。

代码示例:

```cpp #include #include #include #include #include int main() {char hostname[256];struct hostent

host;struct sockaddr_in

addr;// 获取主机名if (gethostname(hostname, sizeof(hostname)) == -1) {std::cerr << "Error getting hostname" << std::endl;return 1;}// 获取地址信息host = gethostbyname(hostname);if (host == nullptr) {std::cerr << "Error getting host by name" << std::endl;return 1;}// 遍历地址信息,找到第一个 IPv4 地址for (int i = 0; host->h_addr_list[i] != nullptr; ++i) {addr = (struct sockaddr_in

)host->h_addr_list[i];if (addr->sin_family == AF_INET) { // IPv4std::cout << "Local IP Address: " << inet_ntoa(addr->sin_addr) << std::endl;break;}}return 0; } ```

说明:

需要包含头文件 ``、``、`` 和 ``。

`gethostname` 函数用于获取主机名。

`gethostbyname` 函数根据主机名获取主机信息,包括 IP 地址。

`inet_ntoa` 函数将网络字节序的 IP 地址转换为点分十进制字符串。### 方法二:利用 `getifaddrs` 函数 (推荐)1.

获取网络接口信息:

使用 `getifaddrs` 函数获取所有网络接口的信息。 2.

遍历接口信息:

遍历接口信息列表,找到类型为 `AF_INET` (IPv4) 的接口。 3.

获取 IP 地址:

从接口信息中获取 IP 地址。

代码示例:

```cpp #include #include #include int main() {struct ifaddrs

ifaddr,

ifa;// 获取网络接口信息if (getifaddrs(&ifaddr) == -1) {std::cerr << "Error getting interface addresses" << std::endl;return 1;}// 遍历接口信息for (ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next) {if (ifa->ifa_addr == nullptr) {continue;}// 找到 IPv4 地址if (ifa->ifa_addr->sa_family == AF_INET) {struct sockaddr_in

sa = (struct sockaddr_in

)ifa->ifa_addr;std::cout << "Interface: " << ifa->ifa_name << std::endl;std::cout << "Local IP Address: " << inet_ntoa(sa->sin_addr) << std::endl;}}// 释放内存freeifaddrs(ifaddr);return 0; } ```

说明:

需要包含头文件 `` 和 ``。

`getifaddrs` 函数用于获取所有网络接口的信息。

`freeifaddrs` 函数用于释放 `getifaddrs` 函数分配的内存。

总结:

以上两种方法都可以获取本机 IP 地址,但 `getifaddrs` 函数更加通用,因为它可以获取所有网络接口的信息,而 `gethostbyname` 函数只能获取主机名对应的地址信息.

C++ 获取本机 IP 地址

简介在网络编程中,获取本机 IP 地址是一项常见需求。C++ 本身并没有提供直接获取 IP 地址的函数,但我们可以借助系统库函数来实现。本文将介绍两种常用的方法,并提供详细的代码示例。

方法一:利用 `gethostname` 和 `getaddrinfo` 函数1. **获取主机名:** 使用 `gethostname` 函数获取本机主机名。 2. **获取地址信息:** 使用 `getaddrinfo` 函数根据主机名获取地址信息,包括 IP 地址。 3. **遍历地址信息:** 遍历 `getaddrinfo` 返回的地址信息列表,找到第一个 IPv4 地址。**代码示例:**```cpp

include

include

include

include

include int main() {char hostname[256];struct hostent *host;struct sockaddr_in *addr;// 获取主机名if (gethostname(hostname, sizeof(hostname)) == -1) {std::cerr << "Error getting hostname" << std::endl;return 1;}// 获取地址信息host = gethostbyname(hostname);if (host == nullptr) {std::cerr << "Error getting host by name" << std::endl;return 1;}// 遍历地址信息,找到第一个 IPv4 地址for (int i = 0; host->h_addr_list[i] != nullptr; ++i) {addr = (struct sockaddr_in *)host->h_addr_list[i];if (addr->sin_family == AF_INET) { // IPv4std::cout << "Local IP Address: " << inet_ntoa(addr->sin_addr) << std::endl;break;}}return 0; } ```**说明:*** 需要包含头文件 ``、``、`` 和 ``。 * `gethostname` 函数用于获取主机名。 * `gethostbyname` 函数根据主机名获取主机信息,包括 IP 地址。 * `inet_ntoa` 函数将网络字节序的 IP 地址转换为点分十进制字符串。

方法二:利用 `getifaddrs` 函数 (推荐)1. **获取网络接口信息:** 使用 `getifaddrs` 函数获取所有网络接口的信息。 2. **遍历接口信息:** 遍历接口信息列表,找到类型为 `AF_INET` (IPv4) 的接口。 3. **获取 IP 地址:** 从接口信息中获取 IP 地址。**代码示例:**```cpp

include

include

include int main() {struct ifaddrs *ifaddr, *ifa;// 获取网络接口信息if (getifaddrs(&ifaddr) == -1) {std::cerr << "Error getting interface addresses" << std::endl;return 1;}// 遍历接口信息for (ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next) {if (ifa->ifa_addr == nullptr) {continue;}// 找到 IPv4 地址if (ifa->ifa_addr->sa_family == AF_INET) {struct sockaddr_in *sa = (struct sockaddr_in *)ifa->ifa_addr;std::cout << "Interface: " << ifa->ifa_name << std::endl;std::cout << "Local IP Address: " << inet_ntoa(sa->sin_addr) << std::endl;}}// 释放内存freeifaddrs(ifaddr);return 0; } ```**说明:*** 需要包含头文件 `` 和 ``。 * `getifaddrs` 函数用于获取所有网络接口的信息。 * `freeifaddrs` 函数用于释放 `getifaddrs` 函数分配的内存。**总结:**以上两种方法都可以获取本机 IP 地址,但 `getifaddrs` 函数更加通用,因为它可以获取所有网络接口的信息,而 `gethostbyname` 函数只能获取主机名对应的地址信息.

标签列表