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); } } |
|