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