连接到主机错误

时间:2014-10-30 22:40:30

标签: c++ qt

我正在尝试了解Qt中的网络是如何工作的。我编写了简单的客户端和服务器,当我使用127.0.0.1localhost作为主机时,它可以正常工作。但是,如果它在另一台计算机上运行,​​我怎么能连接到服务器呢?我试着像IP那样写97.121.34.5地址,但它不起作用。我该怎么办?

服务器:

Server::Server(int port, QWidget *pwgt): QWidget(pwgt), block(0)
{
    server = new QTcpServer(this);
    if(!server->listen(QHostAddress::Any, port))
    {
        QMessageBox::critical(0, "Server Error", "Unable to start the server: " + server->errorString());
        return;
    }
    connect(server, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));
    edit = new QTextEdit;
    edit->setReadOnly(true);

    QVBoxLayout *lay = new QVBoxLayout;
    lay->addWidget(new QLabel("<H1>Server</H1>"));
    lay->addWidget(edit);
    this->setLayout(lay);
}

客户端:

Client::Client(const QString &host, int port, QWidget *pwgt): QWidget(pwgt), block(0)
{
    socket = new QTcpSocket(this);
    socket->connectToHost(host, port);
    connect(socket, SIGNAL(connected()), this, SLOT(slotConnected()));
    connect(socket, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
    connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(slotError(QAbstractSocket::SocketError)));

    edit = new QTextEdit;
    input = new QLineEdit;

    edit->setReadOnly(true);

    QPushButton *send = new QPushButton("Send");
    connect(send, SIGNAL(clicked()), this, SLOT(slotSendToServer()));
    connect(input, SIGNAL(returnPressed()), this, SLOT(slotSendToServer()));

    QVBoxLayout *lay = new QVBoxLayout;
    lay->addWidget(new QLabel("<H1>Client</H1>"));
    lay->addWidget(edit);
    lay->addWidget(input);
    lay->addWidget(send);
    this->setLayout(lay);
}

感谢。

P.S。如果需要,我可以发布我的程序的整个代码。

2 个答案:

答案 0 :(得分:2)

如果它适用于localhost,那么您对该程序没有任何问题。我认为问题在于您不能很好地了解您的网络......例如,如果您的服务器落后NAT,您就无法联系到它。您尝试连接的IP可能是内部网络内部计算机的IP而不是外部互联网。 我认为这是一个棘手的问题,因为没有人知道你的网络。

您需要知道服务器的真实IP地址。如果您有路由器,连接到该路由器的所有计算机都将从该路由器获得IP,该路由器仅在该网络内有效。这意味着,如果您为ISP地址支付了IP的费用,例如89.64.123.3并且您希望与家中的所有计算机连接到互联网,您需要购买路由器,通过该IP地址(即89.64.123.3)将路由器连接到互联网,然后连接所有计算机那个路由器的房子。当您将房屋中的所有计算机连接到该路由器时,每台计算机都会从该路由器获得IP,例如192.168.1.0192.168.1.1192.168.1.9

enter image description here

现在,如果server位于其中一台连接到该路由器的计算机上,client尝试使用其中一个内部IP地址连接到该服务器,即192.168.1.0 1}},192.168.1.1192.168.1.9等您会有惊喜,因为这些IP地址在互联网上不可见。甚至客户端也希望连接到服务器到路由器的IP地址,即89.64.123.3无法正常工作,因为路由器不知道内部网络的哪台计算机转发{{3 }}。在这种情况下,您需要设置和配置TCP frame主机(虽然我不会赌我的钱,这是正确的方式,因为我不是这个领域的大师 - 如果有人知道我说废话,请纠正我)。这样,当数据包到达路由器的IP地址时,路由器会将其转发到您配置路由器的计算机以将其发送到。为路由器配置DMZ主机取决于路由器型号,您应该在互联网上找到相关说明。

我建议您阅读DMZ,以便更深入地了解网络的运作方式。

答案 1 :(得分:0)

您可以使用bash或expect脚本参加本次比赛。 使用QProcess你可以调用这些脚本并使用这个脚本你可以使用telnet或shh轻松连接任何ip,你也可以发送和接收你想要的东西.. 我认为你的问题是什么 - 你想连接另一台有像97.121.34.5这样的ip的机器 你可以很容易地使用expect脚本 示例

QString program = "/opt/expect5.45/expect"; // this is your expect .exe path


           QStringList arguments;

           arguments <<"/tmp/ppc/example.exp"<<ip;// ipboard is ip address of the system that u want to connect with

           myProcess->startDetached(program, arguments),QIODevice::ReadWrite;

           QString datas= myProcess->readAllStandardOutput();

您的期望脚本如下:

#!/home/student/expect -f
set arg1 [lindex $argv 0] // ip address coming from your front end 

spawn telnet arg1 //ip telneting to your server system
expect "login: "
send "your loginname\r" // pass your login name here
expect "Password: "
send "password\r" // send password here 
expect "~$ "
send "something u want\r" // send what u want to exicute
expect "~$ "
send "exit\r"

请学习如何使用expect和期望的脚本它会改善你的答案.. 使用期望你必须安装它