在 Qt 服务器应用程序中处理多个套接字的最佳方式?
Best way to handle multiple sockets in Qt server application?
我正在用 Qt 为一个学校项目制作一个简单的客户端服务器程序,但我 运行 遇到了如何处理与服务器的多个新连接的问题。到目前为止,我用于新连接的代码非常基本:
void LoginServer::newConnection()
{
logSock = server->nextPendingConnection();
if(!logSock->waitForConnected(500))
{
qDebug() << "Connection failed";
}else
{
qDebug() << "It worked!";
connect(logSock, SIGNAL(readyRead()),this, SLOT(readData()));
}
}
我在 Internet 上看到的一种方法是将新连接推送到数据结构(例如向量),并从一个容器中处理它们。我遇到的一个问题是如果我将所有不同的套接字连接到同一个插槽以读取数据,是否有任何优雅的方法来判断哪个套接字发送了信号?
我考虑过的另一种方法是,当发出 readyRead() 时,我可以搜索套接字列表以查看哪些具有 bytesAvailable,但这对我来说似乎是一个过于简单的解决方案。另外,如果两个套接字同时发送数据,程序可能会识别出错误的套接字。
我考虑的另一个选择是覆盖 readyRead() 以在信号中包含对自身的引用,然后我意识到我不知道如何做到这一点。
connect(logSock, SIGNAL(readyRead(QTcpSocket*)),this, SLOT(readData(QTcpSocket*)));
如有任何建议,我们将不胜感激。
您可以通过在插槽中使用以下代码来识别发出 readyRead() 信号的套接字:
QTcpSocket* socket = qobject_cast< QTcpSocket* >(sender());
...并读取数据
socket->readAll()
。
sender()
returns 指向发出信号的 QObject 的指针。
我正在用 Qt 为一个学校项目制作一个简单的客户端服务器程序,但我 运行 遇到了如何处理与服务器的多个新连接的问题。到目前为止,我用于新连接的代码非常基本:
void LoginServer::newConnection()
{
logSock = server->nextPendingConnection();
if(!logSock->waitForConnected(500))
{
qDebug() << "Connection failed";
}else
{
qDebug() << "It worked!";
connect(logSock, SIGNAL(readyRead()),this, SLOT(readData()));
}
}
我在 Internet 上看到的一种方法是将新连接推送到数据结构(例如向量),并从一个容器中处理它们。我遇到的一个问题是如果我将所有不同的套接字连接到同一个插槽以读取数据,是否有任何优雅的方法来判断哪个套接字发送了信号?
我考虑过的另一种方法是,当发出 readyRead() 时,我可以搜索套接字列表以查看哪些具有 bytesAvailable,但这对我来说似乎是一个过于简单的解决方案。另外,如果两个套接字同时发送数据,程序可能会识别出错误的套接字。
我考虑的另一个选择是覆盖 readyRead() 以在信号中包含对自身的引用,然后我意识到我不知道如何做到这一点。
connect(logSock, SIGNAL(readyRead(QTcpSocket*)),this, SLOT(readData(QTcpSocket*)));
如有任何建议,我们将不胜感激。
您可以通过在插槽中使用以下代码来识别发出 readyRead() 信号的套接字:
QTcpSocket* socket = qobject_cast< QTcpSocket* >(sender());
...并读取数据
socket->readAll()
。
sender()
returns 指向发出信号的 QObject 的指针。