在Qt服务器应用程序中处理多个套接字的最佳方法?

时间:2015-06-02 19:43:59

标签: c++ qt sockets network-programming

我正在为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*)));

非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

您可以使用插槽中的以下代码识别发出readyRead()信号的套接字:

QTcpSocket* socket = qobject_cast< QTcpSocket* >(sender());

...并通过阅读数据 socket->readAll()sender()返回指向QObject的指针,QObject发出信号。