gpt4 book ai didi

c++ - QTcpSocket - 扩展 QRunnable 时指定了无效句柄

转载 作者:可可西里 更新时间:2023-11-01 02:34:32 31 4
gpt4 key购买 nike

此代码段中出现此错误:

void TCPConnectThread::run()
{
m_socket = new QTcpSocket();
m_socket->setSocketDescriptor(m_fd);

m_socket->waitForReadyRead(10000);

QString data = m_socket->readAll();

m_socket->waitForDisconnected();
}

有点深入:

if (::WSAIoctl(socketDescriptor, FIONREAD, &dummy, sizeof(dummy), &nbytes,  
sizeof(nbytes), &sizeWritten, 0,0) == SOCKET_ERROR) <-Exception here
{
WS_ERROR_DEBUG(WSAGetLastError());
return -1;
}

深入:

if (::getsockopt(d->socketDescriptor, SOL_SOCKET, 
SO_ERROR, (char *) &value, &valueSize) == 0) <-Here

invalid handle异常在退出run方法时发生。

这是我获取 m_socket 的方式:

m_socket = new QTcpSocket();
m_socket->setSocketDescriptor(m_fd);//m_fd is the socket descriptor of another socket
//from another thread

这是从中收集 m_fd 的线程:

void TCPListenerThread::onNewConnection()
{
QTcpSocket *clientSocket = m_tcpServer->nextPendingConnection();
int sockfd = clientSocket->socketDescriptor();
m_connectThread = new TCPConnectThread(sockfd);
m_threadPool->start(m_connectThread);
}

异常(exception):

Most possible exception at 0x76edf9ea in manager_host.exe:   
0xC0000008: An invalid handle was specified

如何以及在哪里可以找到这个无效句柄?

最佳答案

如果 QTcpSocket 对象已经被另一个 QTcpSocket 对象使用,则不能使用它的套接字描述符。一旦分配给 QTcpSocket

,也没有取消分配的方法

即使你没有显式地使用初始的QTcpSocket,如果它被创建的线程中有一个事件循环(这里很可能就是这种情况),Qt 也会在那个线程中监视它.

作为替代方案,您可以:

  • 派生QTcpServer类重新定义其incomingConnection(int socketDescriptor)在将描述符分配给 QTcpSocket 而不是使用 nextPendingConnection OR
  • 之前获取该描述符的方法
  • 直接将您从 nextPendingConnection 接收到的 QTcpSocket 作为参数传递给线程构造函数,而不是将套接字描述符作为参数传递给线程构造函数,并将其移动到另一个线程(参见that note ):

    TCPConnectThread(QTcpSocket *socket)
    : m_socket(socket)
    {
    m_socket−>setParent(0); // necessary to move the object to another thread
    m_socket->moveToThread(this);
    ...
    }

    由于移动必须从初始线程开始,第一个替代方案可能更容易使用 QRunnable,因为您可能无法轻松访问 future 的 QThread runnable 将被使用。

关于c++ - QTcpSocket - 扩展 QRunnable 时指定了无效句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17226953/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com