gpt4 book ai didi

c++ - 在 Qt 中使用 select() 来监视多个端口,或者有更好的方法吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:22 26 4
gpt4 key购买 nike

我需要一个非常简单的服务器程序,它根据客户端连接执行五种不同事件中的一种。

因为这是一个演示,我不需要任何复杂的网络处理,我的目的只是打开五个服务器套接字(比如 10001 through 10005 inclusive ) 并简单地等待传入连接。

当服务器在(例如)第一个套接字 10001 上接收到传入连接时,它会立即接受并关闭连接,然后执行第一个操作。其他 socket 同上。这样,我就可以通过执行以下命令从另一个窗口演示操作:

telnet 127.0.0.1 10001

通常,我会使用 select() 和一个非常短的超时值(即,在事件处理线程上不太繁重)来等待和检测连接到哪个端口,但是,因为这是一个 Qt 应用程序,我不确定它是否适用于 Qt 事件模型。

使用 Qt(5.5,如果重要的话)执行此操作的最佳方法是什么?使用小超时 select() 是否真的有效,或者我是否需要使用五个单独的 QTcpServer 对象,每个对象都有自己的基础设施(回调和这样的)?

最佳答案

如果我理解正确的话,您希望在一个地方处理所有请求。在 Qt 中你可以使用信号/槽。将来自所有 QTcpServer 对象的信号连接到一个插槽,例如:

// Method to fully start a server on specific port.

QTcpServer *MyClass::StartServer(int port) {
QTcpServer *server = new QTcpServer();
server->listen(QHostAddress::Any, port);
connect(server, SIGNAL(newConnection()), this, SLOT(HandleConn()));
return server;
}

// Method to start all servers, serverArr is an array of QTcpServer
// items (in the object, obviously).

void MyClass::StartAllServers() {
for (size_t i = 0; i < sizeof(serverArr) / sizeof(*serverArr); i++)
serverArr[i] = StartServer(10000 + i);
}

// Callback to handle connections.

void MyClass::HandleConn() {
// This will call doAction with parameter based on which QTcpServer
// has caused the callback.

QTcpServer *source = static_cast<QTcpServer*>(sender());
for (size_t i = 0; i < sizeof(serverArr) / sizeof(*serverArr); i++)
if (source == serverArr[i])
doAction(i);

// Action done, so just accept and close connection.

QTcpSocket *socket = source->nextPendingConnection();
socket->close();
}

关于c++ - 在 Qt 中使用 select() 来监视多个端口,或者有更好的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39740341/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com