[英]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提供商詢問靜態的。
與本地計算機的連接有效,因為我將“內部IP”作為參數傳遞了。 這也是為什么它不能與其他機器一起使用的原因。 因此,將其更改為“外部IP”並使服務器偵聽所有IPv4(如Mattia F.所說)將建立外部連接。
像這樣:
客戶:
socket->connectToHost("177.157.4.38",1234)
服務器:
if(listen(QHostAddress::anyIPv4,1234))
一旦發現,就變得容易了,對嗎? 並不是的。 當我住在巴西時,在這里我們必須擁有靜態IP,而無需支付“少量”額外費用。
我從“ No-IP”下載了名為“ DUC”的免費軟件,該軟件為您提供了動態IP的主機名,並每5分鍾檢查一次更改。 通過連接到該主機名,我設法從任何地方與服務器建立連接。
這是我給客戶的最后一行:
客戶:
socket->connectToHost("andsegcar.ddns.net",1234)
“ andsegcar.ddns.net”是由“ No-IP”創建的我的主機名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.