我对使用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。