如何通过QTcpServer连接2台机器

时间:2016-07-07 20:30:45

标签: c++ qt networking qt5 qtcpsocket

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

问题是,我不知道我应该连接什么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 ....它是动态的,所以这是一个问题。

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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

答案 1 :(得分:0)

主要问题

与本地计算机的连接有效,因为我作为参数传递了我的&#34;内部IP&#34;。这也是为什么它没有与其他机器一起工作的原因。因此将其更改为&#34;外部IP&#34;并使服务器收听所有IPv4(如Mattia F.所述)会使外部连接。

像这样:

<强>客户端:

socket->connectToHost("177.157.4.38",1234)

服务器

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

一旦被发现,它就变得容易了吗?并不是的。当我住在巴西时,我们不能在没有付费的情况下拥有静态IP。额外的费用。

我的解决方案

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

这是我对客户的最后一行:

<强>客户端:

socket->connectToHost("andsegcar.ddns.net",1234)

&#34; andsegcar.ddns.net&#34;是我的主机名由&#34; No-IP&#34;。

创建