6.linux下获取ip地址(C++代码)

方法一:

#include <stdio.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main() 
{
    char hname[128];
    struct hostent *hent;
    int i;

    gethostname(hname, sizeof(hname));

    //hent = gethostent();
    hent = gethostbyname(hname);

    printf("hostname: %s/naddress list: ", hent->h_name);
    for(i = 0; hent->h_addr_list[i]; i++) 
    {
        printf("%s/t", inet_ntoa(*(struct in_addr*)(hent->h_addr_list[i])));
    }
    return 0;
}

方法2: 通过枚举网卡,API接口可查看man 7 netdevice

#include <stdio.h>     
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>

int main (int argc, const char * argv[]) 
{
    struct ifaddrs * ifAddrStruct=NULL;
    void * tmpAddrPtr=NULL;

    getifaddrs(&ifAddrStruct);

    while (ifAddrStruct!=NULL) 
    {
        if (ifAddrStruct->ifa_addr->sa_family==AF_INET) { // check it is IP4
            // is a valid IP4 Address
           tmpAddrPtr=&((struct sockaddr_in*)ifAddrStruct->ifa_addr)->sin_addr;
            char addressBuffer[INET_ADDRSTRLEN];
           inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
           printf("%s IP Address %s/n", ifAddrStruct->ifa_name, addressBuffer);
        } else if (ifAddrStruct->ifa_addr->sa_family==AF_INET6) { // check it is IP6
            // is a valid IP6 Address
           tmpAddrPtr=&((struct sockaddr_in*)ifAddrStruct->ifa_addr)->sin_addr;
            char addressBuffer[INET6_ADDRSTRLEN];
           inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
           printf("%s IP Address %s/n", ifAddrStruct->ifa_name, addressBuffer);
        }
        ifAddrStruct=ifAddrStruct->ifa_next;
    }
    return 0;
}
C++中,尤其是在Linux环境下,你可以通过读取网络接口文件或使用套接字API来获取本地IP地址。以下是一个简单的方法,通过读取`/etc/hostname`和`/etc/hosts`文件来获得主机名和IP地址,以及使用`getifaddrs`函数来获取所有网络接口的详细信息。 ```cpp #include <iostream> #include <fstream> #include <ifaddrs.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <unistd.h> int main() { // 从 /etc/hostname 获取主机名 std::ifstream hostnameFile("/etc/hostname"); std::string hostname; if (hostnameFile.is_open()) { std::getline(hostnameFile, hostname); hostnameFile.close(); } // 从 /etc/hosts 获取与主机名对应的IP地址 std::ifstream hostsFile("/etc/hosts"); std::string line; std::string ip; bool found = false; if (hostsFile.is_open()) { while (std::getline(hostsFile, line)) { std::istringstream iss(line); std::string currentHostname; if (std::getline(iss, currentHostname, ' ') && currentHostname == hostname) { if (std::getline(iss, ip, ' ')) { found = true; break; } } } hostsFile.close(); } if (found) { std::cout << "Hostname: " << hostname << std::endl; std::cout << "IP Address: " << ip << std::endl; } else { std::cout << "Hostname not found in /etc/hosts" << std::endl; } // 使用 getifaddrs 获取所有网络接口的IP地址 struct ifaddrs *ifaddr, *ifa; if (getifaddrs(&ifaddr) == -1) { perror("getifaddrs"); return -1; } for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) continue; if (ifa->ifa_addr->sa_family == AF_INET) { // IPv4 // 获取网络接口名称 std::string interfaceName = ifa->ifa_name; // 将套接字地址转换为IPv4地址 struct sockaddr_in *s = (struct sockaddr_in *)ifa->ifa_addr; char ip[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &s->sin_addr, ip, INET_ADDRSTRLEN); std::cout << "Interface: " << interfaceName << " IP: " << ip << std::endl; } } // 释放 getifaddrs 的资源 freeifaddrs(ifaddr); return 0; } ``` 注意,这段代码仅供参考,实际情况中可能需要更复杂的错误处理和网络接口筛选逻辑。此外,直接从`/etc/hosts`中查找IP地址并不总是可靠,因为管理员可能不会在该文件中维护所有主机名到IP的映射,或者有多个IP对应同一个主机名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值