无法使用Qt在服务器客户端程序中设置全局单播地址

无法使用Qt在服务器客户端程序中设置全局单播地址,qt,networking,ipv6,ethernet,Qt,Networking,Ipv6,Ethernet,我是IPv6新手,我将详细解释我的问题。 使用Qt我已经开发了使用Qt的服务器客户端程序 ->我在服务器和客户端都使用了本地链接地址 ->并且ip地址会随着终端的不同而变化,如果我从3个终端运行服务器,那么服务器ip地址与3个终端不同,客户端的ip地址也不同 ->我想从客户端程序中发现确切的/当前的服务器地址,以便在运行时与服务器连接 我该怎么做,请建议 第二个问题是,在从本地链接更改为全局单播地址时,ip-6 neigh show可能会起作用,因为全局链接将在整个网络中公开 在本例中,我尝试更

我是IPv6新手,我将详细解释我的问题。 使用Qt我已经开发了使用Qt的服务器客户端程序

->我在服务器和客户端都使用了本地链接地址

->并且ip地址会随着终端的不同而变化,如果我从3个终端运行服务器,那么服务器ip地址与3个终端不同,客户端的ip地址也不同

->我想从客户端程序中发现确切的/当前的服务器地址,以便在运行时与服务器连接

我该怎么做,请建议

第二个问题是,在从本地链接更改为全局单播地址时,ip-6 neigh show可能会起作用,因为全局链接将在整个网络中公开

在本例中,我尝试更改以下代码: 以前的代码:QHostAddress address=QHostAddress::AnyIPv6;服务器启动并保持侦听状态

使用以下代码手动分配全局单播地址。 QHostAddress地址; address.setAddress(“2001:0DB8:0000:0002:0022:2217:FF3B:118C”); 这次服务器未启动,说明地址不可用


请就此提出建议。

要查找连接的服务器,您可以将UDP数据报发送到
ff02::1
。这是一个多播地址,将到达链路上的每个已连接IPv6设备(链路本地范围)。当然,这意味着服务器需要监听这些数据报

政府使用这种方法

对于您的服务器问题,最好有更多的代码

假设你做了类似的事情:

QHostAddress address;
address.setAddress("2001:0DB8:0000:0002:0022:2217:FF3B:118C");
QTcpServer server;
server.listen(address)

这意味着您正在收听
2001:0DB8:0000:0002:0022:2217:FF3B:118C
,因此此地址应分配给您的一个接口(网卡)。

要查找连接的服务器,您可以将UDP数据报发送到
ff02::1
。这是一个多播地址,将到达链路上的每个已连接IPv6设备(链路本地范围)。当然,这意味着服务器需要监听这些数据报

政府使用这种方法

对于您的服务器问题,最好有更多的代码

假设你做了类似的事情:

QHostAddress address;
address.setAddress("2001:0DB8:0000:0002:0022:2217:FF3B:118C");
QTcpServer server;
server.listen(address)

这意味着您收听的是
2001:0DB8:0000:0002:0022:2217:FF3B:118C
,因此此地址应分配给您的一个接口(网卡)。

在参考了几个主题和站点后,我终于得到了答案: 简而言之,我的问题是:我需要从客户端动态地找到服务器主机地址。 所以我在广播UDP数据报消息上发现了一些东西,通过网络将接收到的信息发送到网络中的所有节点,监听节点将用主机地址和端口回复到客户端

因此,首先我尝试发送广播消息(仅在IPv4中,IPv6中不可用),这是成功的

在IPv6中广播将做转向多播,利用多播 从客户端必须绑定多播地址“ff02::1%eth0”,然后从服务器必须加入多播组“ff02::1%eth0”

这将成功地帮助发现同一网络中的网络

请纠正我,如果有任何错误,让我知道你的建议,使我的代码更好


--奎师那。

在参考了几个主题和网站后,我终于得到了答案: 简而言之,我的问题是:我需要从客户端动态地找到服务器主机地址。 所以我在广播UDP数据报消息上发现了一些东西,通过网络将接收到的信息发送到网络中的所有节点,监听节点将用主机地址和端口回复到客户端

因此,首先我尝试发送广播消息(仅在IPv4中,IPv6中不可用),这是成功的

在IPv6中广播将做转向多播,利用多播 从客户端必须绑定多播地址“ff02::1%eth0”,然后从服务器必须加入多播组“ff02::1%eth0”

这将成功地帮助发现同一网络中的网络

请纠正我,如果有任何错误,让我知道你的建议,使我的代码更好


--奎师那。

谢谢你的详细解释。对于第二个Qs,您提供的代码,我正在以相同的方式进行操作,但是当我尝试从具有相同IP地址的客户端连接时,它没有连接,请告诉我是否需要配置任何东西以使用全局单播地址??关于查找ip地址,请提供查找ip地址的示例代码,并让我知道此查找方法可以查找链接本地地址?您不需要配置任何特定内容,可以提供更多信息吗?就像电脑的物理连接方式一样,如果你能从一台电脑ping另一台电脑,你的网卡的配置和其他一些代码是什么,特别是你配置插座的代码。@krishna似乎你不太了解IP网络是如何工作的。您不会直接发现地址。当你发送一个多播数据包时,一些网络节点可能会捕捉到它并做出响应。您发现的是将为您提供IP地址的响应,这些地址是响应节点选择放入其响应中的任何地址。此外,我将不为此提供示例代码,这是UPD的基础:在一台机器上打开套接字并侦听,在另一台机器上打开套接字并发送数据。这在QUdpSocket文档中有很好的文档记录。我能够用静态和本地链接IP地址连接服务器和客户端,即从一个终端生成的IPv6本地链接地址是:FE80::42:AFF:FE42:2002,从运行客户端的第二个终端,我将此静态IP地址作为下面的代码QString IP=“FE80::42:AFF:FE42:2002%eth0”;Socket->connectToHostEncrypted(ip,1200,domainName.localDomainName());这很好用。现在我的问题是我想找出/发现服务器