Simple Qt code for network 简单网络连接

Simple Qt code for network simplistic network connection

我对使用 QtNetwork 连接计算机完全陌生。

现在我只想看到连接尝试。因此,我创建了一个 GUI 应用程序,并在 mainwindow.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,其代码如下 Listener.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) 中,我在其中 运行 程序并按下通话按钮。据我所知,这应该尝试在端口 25000 打开到 IP(10.255.255.101)的连接,我应该在控制台中收到 "New connection" 消息。但是没有出现这样的消息。由于这不起作用,我不会继续前进。

任何人都可以告诉我我可能做错了什么吗?

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

Tells the server to listen for incoming connections on address address and port port. If port is 0, a port is chosen automatically. If address is QHostAddress::Any, the server will listen on all network interfaces.

QHostAddress::Any 表示您正在侦听所有网络接口,而不是端口。 (例如,如果您只想拥有一个本地服务器,则可以使用 QHostAddress::LocalHost - 检查 QHostAddress::SpecialAddress 以获得更多类似信息。

如果你想手动设置端口,你必须调用:

listen(QHostAddress::Any, 25000);

如果没有,您可以调用

获取自动选择的端口
quint16 port = serverPort();

您无法使用 "listening on any port" 习语;这不是 UDP 和 TCP 的使用方式。您很可能不应该以这种方式设计您的通信。使用专用端口。

如果您想构建数据包嗅探器,则必须使用为此设计的特定于平台的机制。有一些库可以帮助您完成该任务,最著名的是来自 TcpDump 项目的 WinPcap on Windows and cross-platform libpcap