QTcpSocket的SocketDescriptor为-1

时间:2013-11-10 17:48:12

标签: qt tcp

我正在为自己设计服务器/客户端系统。我创建了一个从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);
}

有什么不对?

2 个答案:

答案 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());
}