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

时间:2016-02-29 16:39:52

标签: qt tcp-ip

我是使用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;
}

所以我运行了同一个程序的两个实例。一个是我的机器。我运行程序并按下Listen按钮(IP 10.255.255.101)。

第二个实例在虚拟机(IP 10.255.255.215)中运行,我运行程序并按下“通话”按钮。据我所知,这应该尝试在端口25000处打开到IP的连接(即10.255.255.101),并且我应该在控制台中获得“新连接”消息。但是没有出现此类消息。由于这不起作用,我不会继续前进。

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

2 个答案:

答案 0 :(得分:3)

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

  

告诉服务器侦听地址上的传入连接   和港口。如果port为0,则自动选择端口。如果   地址是QHostAddress :: Any,服务器将在所有网络上侦听   接口

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

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

listen(QHostAddress::Any, 25000);

如果没有,您可以通过调用

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

答案 1 :(得分:0)

聆听任何端口&#34;成语不适合您使用;它不是如何使用UDP和TCP的。很可能你不应该以这种方式设计你的通信。使用专用端口。

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