我正在为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()));
}
}
我在互联网上看到的一种方法是将新连接推送到数据结构(如矢量),并从一个容器中处理它们。我遇到的一个问题是,如果是这样的话,我将所有不同的套接字连接到同一个插槽来读取数据,是否有任何优雅的方式来判断哪个套接字发送了信号?
我认为这样做的另一种方式是,当发出readyRead()时,我可以搜索套接字列表以查看哪些具有bytesAvailable,但这对我来说似乎是一个过于简单的解决方案。另外,如果两个套接字同时发送数据,程序可能会识别错误的套接字。
我考虑的另一个选择是覆盖readyRead()以在信号中包含对自身的引用,然后我意识到我不知道如何做到这一点。
connect(logSock, SIGNAL(readyRead(QTcpSocket*)),this, SLOT(readData(QTcpSocket*)));
非常感谢任何建议。
答案 0 :(得分:1)
您可以使用插槽中的以下代码识别发出readyRead()信号的套接字:
QTcpSocket* socket = qobject_cast< QTcpSocket* >(sender());
...并通过阅读数据
socket->readAll()
。
sender()
返回指向QObject的指针,QObject发出信号。