简单的Qt代码,用于网络简单的网络连接



我对使用QtNetwork连接计算机是全新的。

现在我只想看到连接的尝试。所以我创建了一个 GUI 应用程序,并在主窗口上.cpp我将这两个函数编写为两个按钮的插槽:

void MainWindow::on_pbTalk_clicked(){
    QString IP = ui->leIP->text();
    ui->pteLog->appendPlainText("Now Talking to IP: " + IP);
    talker = new Talker();
    talker->connectToHost(IP,25000);
}
void MainWindow::on_pbListen_clicked(){
    ui->pteLog->appendPlainText("Now listening on any port, I think");
    listener = new Listener(this);
    if (!connect(listener, SIGNAL(newConnection()), this, SLOT(on_newConnections()))){
        ui->pteLog->appendPlainText("The connection of slot and signal failed!");
    }
}

现在Talker本质上是一个QTcpSocket,目前还没有重新实现任何东西。

Listener 是一个 QTcpServer 具有以下代码和侦听器.cpp:

Listener::Listener(QObject *parent) :
    QTcpServer(parent)
{
    qDebug() << "Listening on any port";
    listen(QHostAddress::Any);
}
void Listener::incomingConnection(int socketDescriptor){
    qDebug() << "New connection: " << socketDescriptor;
}

所以我运行同一程序的两个实例。一个在我的机器里。我运行程序并按下收听按钮(IP 10.255.255.101)。

第二个实例在虚拟机 (IP 10.255.255.215) 中运行,我在其中运行程序并按下 Talk 按钮。据我了解,这应该尝试在端口 10.255.255.101 上打开与 IP 的连接 25000,并且我应该在控制台中收到"新连接"消息。但是,不会出现此类消息。由于这不起作用,所以我不会继续前进。

谁能告诉我我可能做错了什么?

检查QTcpServer::listen的文档 - 它说:

告知服务器侦听地址地址上的传入连接 和端口端口。如果端口为 0,则自动选择端口。如果 地址是QHost地址::任意,服务器将监听所有网络 接口。

QHostAddress::Any意味着您正在侦听所有网络接口,而不是端口。(例如,如果您只想拥有本地服务器,则可以使用QHostAddress::LocalHost - 查看QHostAddress::SpecialAddress以获取更多类似内容。

如果要手动设置端口,则必须调用:

listen(QHostAddress::Any, 25000);

如果没有,您可以通过调用来获取自动选择的端口

quint16 port = serverPort();

"侦听任何端口"习惯用语不适合您使用;这不是UDP和TCP的使用方式。很可能你不应该以这种方式设计你的通信。使用专用端口。

如果要构建数据包嗅探器,则必须使用为此设计的特定于平台的机制。有一些库可以帮助你完成这项任务,最值得注意的是Windows上的WinPcap和TcpDump项目的跨平台libpcap。

最新更新