您的位置:

Qt获取本机IP地址

一、从JS获取本机IP地址

Js获取本机IP地址的方法主要是通过向外发送请求,然后通过请求的IP地址和响应得到本机IP地址。

代码示例:


function getIPAdress()
{
    var script = document.createElement('script');
    script.src = 'https://api.ipify.org?format=jsonp&callback=getIP';
    document.body.appendChild(script);
}
function getIP(response)
{
    console.log('IP address:', response.ip);
}

上述代码先创建一个script元素,然后在其src属性中加入对IP查询请求的地址,并指定回调函数为getIP。接下来在当前页面中添加这个元素,浏览器会自动向IP查询请求发出请求,并返回数据,在此数据中包含了本机的IP地址,最后通过getIP函数对其进行处理。

二、Qt获取本机IP地址

1.获取本机IP地址

在Qt中获取本机IP地址,可以直接使用Qt提供的API获取。

代码示例:


#include <QNetworkInterface>

QList<QHostAddress> list = QNetworkInterface::allAddresses();
foreach (QHostAddress address, list)
{
    if (address.protocol() == QAbstractSocket::IPv4Protocol && address != QHostAddress(QHostAddress::LocalHost))
    {
        qDebug() << address.toString();
    }
}

首先,通过QNetworkInterface::allAddresses()方法可以获取该主机所有的网卡地址信息,并将其存放在QList中。接着通过迭代器对这个QList进行遍历处理,过滤出IPv4协议类型,并且地址不为本地地址的所有项,返回的数据是QHostAddress类型,通过其tostring()方法可以获取到IPv4地址的字符串形式,即本机IP地址。

2.获取本机主机名

在对本机IP地址进行操作时,有时还需要获取本机的主机名。在Qt中也可以轻松获取到本机主机名。

代码示例:


#include <QHostInfo>

QString hostname = QHostInfo::localHostName();
qDebug() << hostname;

首先,通过QHostInfo::localHostName()方法可以获取当前主机的主机名,即本机的主机名。由于此方法返回的是QString类型的主机名,因此通过qDebug()函数,将主机名打印到控制台上。

三、获取本机IP地址的其他方法

1.使用C获取本机IP地址

除了使用Qt自带的API之外,我们还可以使用C语言的API获取到本机IP地址。

代码示例:


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

int main()
{
    int i;
    int sockfd;
    char buf[1024];
    struct ifconf ifconf;
    struct ifreq *ifreq;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("socket");
        return -1;
    }

    ifconf.ifc_len = sizeof(buf);
    ifconf.ifc_buf = buf;

    if (ioctl(sockfd, SIOCGIFCONF, &ifconf) == -1)
    {
        perror("ioctl");
        return -1;
    }

    ifreq = (struct ifreq *)buf;
    for (i = (ifconf.ifc_len / sizeof(struct ifreq)); i > 0; i--)
    {
        printf("adapter name: %s\n", ifreq->ifr_name);
        printf("IP address: %s\n", inet_ntoa(((struct sockaddr_in *)&(ifreq->ifr_addr))->sin_addr));

        ifreq++;
    }

    close(sockfd);

    return 0;
}

代码实现的功能是,创建一个套接字,然后通过ioctl()函数来调用系统接口获取该主机所有的网卡信息,最后对这些信息进行遍历,并过滤出IPv4协议类型,并打印该地址的字符串表示形式,即本机IP地址。

2.使用Socket获取本机IP地址

通过Socket获取本机IP地址,主要是通过建立连接来获取本机IP地址。

代码示例:


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
    int sockfd;
    struct sockaddr_in server;

    memset(&server, 0, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(8000);
    server.sin_addr.s_addr = htonl(INADDR_ANY);

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
    {
        perror("socket");
        return -1;
    }

    if (bind(sockfd, (struct sockaddr *)&server, sizeof(server)) == -1)
    {
        perror("bind");
        return -1;
    }

    if (listen(sockfd, 5) == -1)
    {
        perror("listen");
        return -1;
    }

    struct sockaddr_in client;
    int addrlen = sizeof(client);
    int new_fd = accept(sockfd, (struct sockaddr *)&client, &addrlen);
    if (new_fd < 0)
    {
        perror("accept");
        return -1;
    }

    char ip[32];
    printf("IP address: %s\n", inet_ntop(AF_INET, &client.sin_addr.s_addr, ip, sizeof(ip)));

    close(new_fd);
    close(sockfd);

    return 0;
}

代码实现的功能是,首先创建一个服务器端的套接字,并将其绑定在一个端口上,然后调用listen()函数来监听端口的请求。接着,使用accept()函数,处理客户端请求,然后获取客户端的IP地址,并将其打印在控制台上。

3.使用awk实现获取本机IP地址

我们也可以使用awk工具来获取本机IP地址。

代码示例:


ifconfig | awk '/inet addr/{print substr($2,6)}'

该命令会使用ifconfig命令来获取所有地址信息,并通过awk来进行过滤,最终打印出IPv4地址的字符串表示形式,即本机IP地址。

四、Qt获取本地IP地址

在Qt中,我们可以使用QHostAddress::LocalHost来获取本地IP地址。

代码示例:


#include <QHostAddress>

QHostAddress address = QHostAddress::LocalHost;
qDebug() << address.toString();

该代码通过QHostAddress::LocalHost获取到本地IP地址的QHostAddress类型实例,将其打印为IPv4地址的字符串形式。