我正在为自己设计服务器/客户端系统。我创建了一个从QTcpServer
扩展并定义QMap <ClientName, int> sockets
的类来处理连接的客户端。当sockets
映射不包含与新客户端具有相同ClientName
的套接字时,客户端可以连接到服务器。因此,当新套接字连接到服务器时,我将客户端Pair <ClientName, SocketDescriptor>
存储在qmap中。有了这些解释,我应该从服务器的客户端disconnects
中删除qmap中的客户端描述符。所以,我创建了一个插槽void disconnected()
并按如下方式实现:
void MyServer::disconnected()
{
QTcpSocket* socket = (QTcpSocket*) sender();
ClientType socketType = ClientTypeNone;
foreach(ClientType key, _sockets.keys())
{
if (sockets.value(key) == socket.socketDescriptor())
{
socketType = key;
break;
}
}
if (socketType != ClientTypeNone)
{
sockets.remove(socketType);
}
}
但是,socket.socketDescriptor
是-1,而我在下面的代码中设置它:
void MyServer::inComingConnection(qintptr socketDescriptor)
{
QTcpSocket* socket = nextPendingConnection();
connect(s, SIGNAL(readyRead()), this, SLOT(readyRead());
connect(s, SIGNAL(disconnected()), this, SLOT(disconnected());
socket->setSocketDescriptor(socketDescriptor);
}
有什么不对?
答案 0 :(得分:0)
这是QT助理的回答,也许是帮助,
qintptr QTcpServer::socketDescriptor() const
返回服务器用于侦听传入指令的本机套接字描述符,如果服务器未侦听,则返回 -1。
如果服务器使用QNetworkProxy
,则返回的描述符可能无法用于本机套接字函数。
答案 1 :(得分:0)
我认为您的函数inComingConnection应该重命名为incomingConnection以成为有效的覆盖。
但为什么你不让Qt为你设置描述符呢?
根据Qt文档:
void QTcpServer::incomingConnection(qintptr socketDescriptor)
...基础实现创建QTcpSocket,设置套接字 描述符然后将QTcpSocket存储在内部列表中 待定连接。最后发出newConnection()。 ...
这样你就可以简单地使用addPendingConnection:
void MyServer::addPendingConnection(QTcpSocket *s)
{
QTcpServer::addPendingConnection(s);
connect(s, SIGNAL(readyRead()), this, SLOT(readyRead());
connect(s, SIGNAL(disconnected()), this, SLOT(disconnected());
}