一个简单的测试越搞越复杂,新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);
}
}