查看完整版本: [-- QT TCP Server Multi Thread Client Socket Dontwork --]

QTCN开发网 -> Qt基础编程 -> QT TCP Server Multi Thread Client Socket Dontwork [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

stuchang 2020-02-21 14:33

QT TCP Server Multi Thread Client Socket Dontwork

一个简单的测试越搞越复杂,新ServerClass 重写 QTCPSever::incomingconnection, 使用QThreadpool 创建新线程for Client,run内setSocketDescriptor(handle),现象是,能成功关联获取QTCPSocket ,但是状态是死的,一直connected, Read Wirte 也不能用。
帖部分代码,初来乍到,请不吝赐教
MainClass Constructor :

if(MainWindow::getServer()->listen(QHostAddress::Any,4399))//(server->listen(QHostAddress::Any,4399))
    {
        qWarning("Server Listening on 4399!");        
    }

void MultiThreadTcpServer::incomingConnection(int handle)
{
    if(0==handle) return;
    ClientThread * pClientThr=new ClientThread();    
    pClientThr->handle=handle;
    pClientThr->setAutoDelete(true);
    QThreadPool::globalInstance()->start(pClientThr);
    qWarning("Creat new thread!");

}

void ClientThread::run()
{    
    QTcpSocket Skt;
    QByteArray get;
    bool newframe=false;    
    if(!Skt.setSocketDescriptor(handle,QAbstractSocket::ConnectedState))
        qFatal("Cant SetDescriptor!");
    qWarning("New Client%s-%d.",Skt.peerAddress().toString().toLatin1().data(),Skt.peerPort());
    QFile log(Skt.peerAddress().toString()+".log");
    if(!log.exists())
        log.setFileName(Skt.peerAddress().toString()+".log");
    if(!log.open(QFile::Truncate|QFile::ReadWrite))
        qCritical("Cant Create Log file!");
    while(true)
    {
        int state=Skt.state();
        if(state!=QAbstractSocket::ConnectedState)
        {
            qWarning("Client%s-%d state %d!.close!",Skt.peerAddress().toString().toLatin1().data(),Skt.peerPort(),state);
            Skt.close();
            log.close();
            return;
        }
        QByteArray tmp;
        tmp=Skt.read(6);
        if(!tmp.isEmpty())
            Skt.write(tmp),get.append(tmp),log.write("\r\n"+tmp.toHex()),qDebug()<<"Rev New:"<<tmp.toHex()<<"\r\n";
        if(!newframe)
        {
            if(get.size()<4) continue;
            if(((quint8)get.at(0)==0xAA) && ((quint8)get.at(1)==0x12) && ((quint8)get.at(2)==0x21) && ((quint8)get.at(3)==0x55))
            {
                newframe=true;                
                get.remove(0,4);
                continue;
            }
            else
            {                
                qWarning("Client%s-%d Lose Head Sync,close!",Skt.peerAddress().toString().toLatin1().data(),Skt.peerPort());
                Skt.close();
                log.close();
                return;
            }
        }
        else
        {
            if(get.size()<2) continue;
            //...
            qWarning("Client%s-%d Get a peise!",Skt.peerAddress().toString().toLatin1().data(),Skt.peerPort());
            get.remove(0,2);
            newframe=false;
        }        
        Skt.write("hexie!\r\n");
        Skt.flush();
        sleep(3);
    }
}

liulin188 2020-02-21 14:56
incomingconnection进来后,创建线程处理新的socket
我一直用的这个模型,没有问题,网上也有帖子

来就是玩的 2021-12-10 17:32
这是服务器端的,有客户端的么?


查看完整版本: [-- QT TCP Server Multi Thread Client Socket Dontwork --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled