首页| 论坛| 消息
主题:QT TCP Server Multi Thread Client Socket Dontwork
stuchang发表于 2020-02-21 14:33
一个简单的测试越搞越复杂,新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()
回帖(2):
2楼:这是服务器端的,有客户端的么?
1楼:incomingconnection进来后,创建线程处理新的socket
我一直用的这个模型,没有问题,网上也 ..

全部回帖(2)»
最新回帖
收藏本帖
发新帖