如何通过QTcpServer连接2台机器
How to connect 2 machines through QTcpServer
我有一个程序(客户端)需要连接到另一台机器(服务器)。
问题是,我不知道应该连接到哪个 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...。它是动态的,所以这是个问题。
我认为问题不在代码本身。
如果你想测试你的程序,运行你机器上的服务器和客户端,让服务器监听所有地址(但我不知道为什么你不允许本地主机在您的服务器代码)和您的客户端连接到本地主机(127.0.0.1)。
为了让服务器监听所有地址,我使用:
server->listen (QHostAddress::AnyIPv4, 1234);
无论如何,如果你想从另一台机器连接到服务器,你当然必须使用服务器PC的外部IP。
但是要做到这一点,您需要一个静态 IP。通常您可以向您的 Internet 提供商索要静态的。
主要问题
与本地计算机的连接有效,因为我将 "internal IP" 作为参数传递。这也是它不能与其他机器一起工作的原因。因此,将其更改为 "external IP" 并让服务器侦听所有 IPv4(如 Mattia F. 所说)将建立外部连接。
像这样:
客户:
socket->connectToHost("177.157.4.38",1234)
服务器:
if(listen(QHostAddress::anyIPv4,1234))
一旦发现,就变得容易了吧?并不真地。我住在巴西,如果不支付 "little" 额外费用,我们就无法拥有静态 IP。
我的解决方案
我从 "No-IP" 下载了名为 "DUC" 的免费软件,它为您的动态 IP 提供主机名,并每 5 分钟检查一次更改。通过连接到这个主机名,我设法从任何地方与我的服务器建立连接。
这是我对客户的最后一句话:
客户:
socket->connectToHost("andsegcar.ddns.net",1234)
"andsegcar.ddns.net" 是由 "No-IP" 创建的我的主机名。
我有一个程序(客户端)需要连接到另一台机器(服务器)。
问题是,我不知道应该连接到哪个 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...。它是动态的,所以这是个问题。
我认为问题不在代码本身。
如果你想测试你的程序,运行你机器上的服务器和客户端,让服务器监听所有地址(但我不知道为什么你不允许本地主机在您的服务器代码)和您的客户端连接到本地主机(127.0.0.1)。
为了让服务器监听所有地址,我使用:
server->listen (QHostAddress::AnyIPv4, 1234);
无论如何,如果你想从另一台机器连接到服务器,你当然必须使用服务器PC的外部IP。
但是要做到这一点,您需要一个静态 IP。通常您可以向您的 Internet 提供商索要静态的。
主要问题
与本地计算机的连接有效,因为我将 "internal IP" 作为参数传递。这也是它不能与其他机器一起工作的原因。因此,将其更改为 "external IP" 并让服务器侦听所有 IPv4(如 Mattia F. 所说)将建立外部连接。
像这样:
客户:
socket->connectToHost("177.157.4.38",1234)
服务器:
if(listen(QHostAddress::anyIPv4,1234))
一旦发现,就变得容易了吧?并不真地。我住在巴西,如果不支付 "little" 额外费用,我们就无法拥有静态 IP。
我的解决方案
我从 "No-IP" 下载了名为 "DUC" 的免费软件,它为您的动态 IP 提供主机名,并每 5 分钟检查一次更改。通过连接到这个主机名,我设法从任何地方与我的服务器建立连接。
这是我对客户的最后一句话:
客户:
socket->connectToHost("andsegcar.ddns.net",1234)
"andsegcar.ddns.net" 是由 "No-IP" 创建的我的主机名。