我正在尝试了解Qt
中的网络是如何工作的。我编写了简单的客户端和服务器,当我使用127.0.0.1
或localhost
作为主机时,它可以正常工作。但是,如果它在另一台计算机上运行,我怎么能连接到服务器呢?我试着像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。如果需要,我可以发布我的程序的整个代码。
答案 0 :(得分:2)
如果它适用于localhost
,那么您对该程序没有任何问题。我认为问题在于您不能很好地了解您的网络......例如,如果您的服务器落后NAT,您就无法联系到它。您尝试连接的IP
可能是内部网络内部计算机的IP
而不是外部互联网。
我认为这是一个棘手的问题,因为没有人知道你的网络。
您需要知道服务器的真实IP
地址。如果您有路由器,连接到该路由器的所有计算机都将从该路由器获得IP
,该路由器仅在该网络内有效。这意味着,如果您为ISP
地址支付了IP
的费用,例如89.64.123.3
并且您希望与家中的所有计算机连接到互联网,您需要购买路由器,通过该IP地址(即89.64.123.3
)将路由器连接到互联网,然后连接所有计算机那个路由器的房子。当您将房屋中的所有计算机连接到该路由器时,每台计算机都会从该路由器获得IP
,例如192.168.1.0
,192.168.1.1
,192.168.1.9
等
现在,如果server
位于其中一台连接到该路由器的计算机上,client
尝试使用其中一个内部IP
地址连接到该服务器,即192.168.1.0
1}},192.168.1.1
,192.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和期望的脚本它会改善你的答案.. 使用期望你必须安装它