如何通过QTcpServer连接2台机器

Posted

技术标签:

【中文标题】如何通过QTcpServer连接2台机器【英文标题】:How to connect 2 machines through QTcpServer 【发布时间】:2016-07-07 20:30:45 【问题描述】:

我有一个程序(客户端)需要连接到另一台机器(服务器)。

问题是,我不知道我应该连接到什么 IP 以及我应该转发什么端口。这既适用于服务器,也适用于客户端。

假设我使用端口1234进行测试。

在我的服务器中,我有以下代码:


MyServer.cpp

QString MyServer::StartServer()

QHostAddress ipAddress;
QList<QHostAddress> ipAddressList = QNetworkInterface::allAddresses();
for(int i=0;i<ipAddressList.size();i++)

    if(ipAddressList.at(i) != QHostAddress::LocalHost &&
       ipAddressList.at(i).toIPv4Address())
    
        ipAddress = ipAddressList.at(i);
        break;
    

if(ipAddressList.isEmpty())
    ipAddress = QHostAddress(QHostAddress::LocalHost);
if(listen(ipAddress,1234))

    qDebug() << this->serverAddress().toString();
    qDebug() << this->serverPort();
    return QString("Server online!");

else
    return QString("Error!");


在我进行的测试中,IP 将始终是我的内部 IP (192.168.25.208)。但是,在我的客户端程序中,我永远不知道要连接什么 IP。

这是我的客户端代码:


MyClient.cpp

void Pesquisa::ConnectConfig()

    socket = new QTcpSocket(this);
    connect(socket,SIGNAL(connected()),this,SLOT(Connected()));
    connect(socket,SIGNAL(disconnected()),this,SLOT(Disconnected()));
    //What IP should I use here?
    socket->connectToHost("192.168.25.208",1234);


我应该连接到服务器正在运行的内部 IP 吗?机器(服务器)的外部IP?另外,如果我需要使用我的外部 IP.... 它是动态的,所以这是一个问题。

【问题讨论】:

我想我“找到了方法”!我将使用“no-IP”并尝试在软件中使用它的主机名。也许它会起作用。我会带着结果回来的。 【参考方案1】:

我认为问题不在于代码本身。

如果你想测试你的程序,在你的机器上同时运行服务器和客户端,让服务器监听所有地址(但我不知道你为什么不允许 localhost 在你的服务器代码中)和你的客户端连接到 localhost (127.0.0.1)。

为了让服务器监听所有地址,我使用:

server->listen (QHostAddress::AnyIPv4, 1234);

无论如何,如果要从另一台机器连接到服务器,当然必须使用服务器PC的外部IP。

但要做到这一点,您需要一个静态 IP。通常您可以向您的 Internet 提供商索要静态的。

【讨论】:

我 100% 确定在同一台机器上运行两者都有效(刚刚测试过)。现在从不同的机器上做......那根本不起作用(也许是因为我使用的是内部IP......现在我想这没有意义)。 假设我住在某个地方,如果我想要一个静态 IP.... 我将不得不为此付费。有没有办法绕过它? 好吧,我现在帮不了你了。我免费得到了我的,我怀疑你除了付费还能做任何其他事情。【参考方案2】:

主要问题

与本地计算机的连接正常,因为我将“内部 IP”作为参数传递。这也是为什么它不能与其他机器一起使用的原因。因此,将其更改为“外部 IP”并让服务器侦听所有 IPv4(如 Mattia F. 所说)将建立外部连接。

像这样:

客户:

socket-&gt;connectToHost("177.157.4.38",1234)

服务器:

if(listen(QHostAddress::anyIPv4,1234))

一旦被发现,就变得容易了,对吧?并不真地。因为我住在巴西,所以如果不支付“一点”额外费用,我们就无法拥有静态 IP。

我的解决方案

我从“No-IP”下载了名为“DUC”的免费软件,它为您的动态 IP 提供了一个主机名,并每 5 分钟检查一次更改。通过连接到这个主机名,我设法从任何地方与我的服务器建立连接。

这是我给客户的最后一句话:

客户:

socket-&gt;connectToHost("andsegcar.ddns.net",1234)

“andsegcar.ddns.net”是我由“No-IP”创建的主机名。

【讨论】:

以上是关于如何通过QTcpServer连接2台机器的主要内容,如果未能解决你的问题,请参考以下文章

如何在两台机器之间通过 IP 建立非静态 L2TPv3 套接字连接

高手请进!如何利用OpenVPN共享上网?

QTcpServer服务器无法监听和客户端连接不上问题

两台电脑通过vpn访问公司内网,两台电脑之间能访问吗

如何通过IBM SPSS Modeler对数据进行处理和建模

在基于 Eclipse 的 IDE 中,如何通过两个 ssh 连接访问远程文件?