c++ - 在qt/linux中如何获取ip地址?

标签 c++ c linux qt sockets

我正在 Qt 上开发一个服务器客户端项目。服务器运行在一台有多个网络接口(interface)的机器上。设计是这样的客户端将自动发现服务器。即客户端将其 IP 广播到网络,服务器获取该消息并发回服务器的 IP。现在的问题是,当我尝试获取服务器中的 IP 时,有不止 1 个 IP。如何获取服务器接收消息的接口(interface)IP?

最佳答案

这可能是适合您的解决方案

IPAddress FindLocalIPAddressOfIncomingPacket( senderAddr )
{
    foreach( adapter in EnumAllNetworkAdapters() )
    {
        adapterSubnet = adapter.subnetmask & adapter.ipaddress;
        senderSubnet = adapter.subnetmask & senderAddr;
        if( adapterSubnet == senderSubnet )
        {
            return adapter.ipaddress;
        }
    }
}

How to get your own (local) IP-Address from an udp-socket (C/C++)


为了获得传入的对端 IP 地址,您可以使用 C 中的以下解决方案

socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
int port;

len = sizeof addr;
getpeername(s, (struct sockaddr*)&addr, &len);

// deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
    struct sockaddr_in *s = (struct sockaddr_in *)&addr;
    port = ntohs(s->sin_port);
    inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
    struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
    port = ntohs(s->sin6_port);
    inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}

printf("Peer IP address: %s\n", ipstr);

Getting the source address of an incoming socket connection

关于c++ - 在qt/linux中如何获取ip地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21932225/

相关文章:

c++ - Shared_pointer 显示出与我在教科书中读到的行为不同的行为

C++ Ubuntu。使用 FFMPEG 库编译的多个 undefined reference

c++ - 一种保存代码版本(Xcode)的优雅方法?

c - float 数组没有得到正确的大小——C

c++ - 有什么理由在Arduino中编写我自己的库吗?

c++ - 如何从加载的 .ive 模型树中旋转/转换现有的 OpenSceneGraph (OSG) 节点?

C++ 在主线程中处理多个线程

c++ - 第 16 行 : $'\r' : command not found ( pscan2. c)

c - 给定函数标识符,是否有命令行程序或库函数提供存储在 elf 文件中的地址

c - c语言如何截取一个中英文单词混合字符串