在我的程序中,我想设置 TCP 服务器的客户端限制。
目前我的传入连接代码是:
void TCPServer::incomingConnection(int handle)
{
QPointer<TCPClient> client = new TCPClient(this);
client->SetSocket(handle);
clients[handle] = client;
QObject::connect(client, SIGNAL(MessageRecieved(int,QString)), this, SLOT(MessageRecieved(int,QString)));
QObject::connect(client, SIGNAL(ClientDisconnected(int)), this, SLOT(ClientDisconnected(int)));
emit ClientConnected(handle);
}
Run Code Online (Sandbox Code Playgroud)
现在我想将客户端数量限制为例如 100 个活动连接总数。我是否必须以某种特殊的方式处理它,或者只是使用简单的if(clients.count() < 100)语句忽略它?
void TCPServer::incomingConnection(int handle)
{
if(clients.count() < 100)
{
QPointer<TCPClient> client = new TCPClient(this);
client->SetSocket(handle);
clients[handle] = client;
QObject::connect(client, SIGNAL(MessageRecieved(int,QString)), this, SLOT(MessageRecieved(int,QString)));
QObject::connect(client, SIGNAL(ClientDisconnected(int)), this, SLOT(ClientDisconnected(int)));
emit ClientConnected(handle);
}
}
Run Code Online (Sandbox Code Playgroud)
这样做可以吗?未处理的连接是否处于活动状态(连接到服务器)但未在我的clients字典中列出?
您可以使用QTcpServer::setMaxPendingConnections ( int numConnections )。它设置 QTcpServer 的最大传入连接数。
来自 Qt 文档:
无效 QTcpServer::setMaxPendingConnections(int numConnections)
将挂起的已接受连接的最大数量设置为 numConnections。在调用 nextPendingConnection() 之前,QTcpServer 将接受不超过 numConnections 的传入连接。默认情况下,限制为 30 个待处理连接。
在服务器达到挂起连接的最大数量后,客户端仍然可以连接(即,QTcpSocket 仍然可以发出connected() 信号)。QTcpServer 将停止接受新连接,但操作系统可能仍将它们保留在队列中。
因此,如果连接数量超过 numConnections,服务器将停止接受新连接,但操作系统可能会将它们排队。