【问题标题】:How to get the ip address in qt/linux?如何在qt/linux中获取ip地址?
【发布时间】:2014-03-22 20:05:55
【问题描述】:

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

【问题讨论】:

  • 为什么需要知道服务器接口的IP?如果您在多个接口上从客户端获得广播,只需响应所有接口。客户端需要过滤掉多个响应,然后只选择一个。
  • 您几乎不需要通过网络发送自己的 IP 地址。每个 IP 数据包都已经包含一个可用的源地址。对方只需要getpeername或recvfrom即可。
  • @unwind 服务器运行在一台有多个网络的机器上。客户端需要一个有效的 IP(客户端网络中的 IP)来进行通信以获取更多数据。
  • @Griffin 是的,我明白了。但是,如果服务器在其多个接口上看到来自客户端的广播,则证明使用接收到的 IP 在每个接口上都有连接,因此服务器可以响应这些接口。我仍然没有得到我所缺少的东西。 :/ 也许你可以编辑你的问题来澄清它。

标签: c++ c linux qt sockets


【解决方案1】:

这可能是你的解决方案

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

【讨论】:

  • 这仅适用于同一本地网络上的机器(当它有效时),这有点限制。
  • @Griffin 是的。不要通过网络发送您自己的 IP。这是一种错误和破碎的沟通方式。让接收方找出发送方的地址。
  • @n.m.客户端应用程序基于 JAVA(Android)。您知道如何从 UDP 数据包中获取发件人的 IP 吗??
  • 答案中提供的代码 sn-p 取决于网络结构。
猜你喜欢
  • 2012-11-29
  • 2010-09-17
  • 2011-07-01
  • 2011-05-07
  • 2011-01-18
  • 1970-01-01
  • 2010-12-26
  • 2014-08-07
相关资源
最近更新 更多