【发布时间】:2014-10-15 10:59:52
【问题描述】:
我在 Linux 上使用 Qt 5.3。 我在 Linux 上运行 QCoreApplication 服务器,当新连接从客户端到达时,服务器会自行分叉。
void Ccbox::incomingConnection(qintptr handle) {
qDebug()<<"Ccbox::incomingConnection";
pid_t PID=fork();
if(PID==0) {
this->close();
this->startNetwork(handle);
} else {
qDebug()<<"Ccbox::incomingConnection another process started";
}
}
“this->close()”是关闭子进程像父进程一样监听端口,然后将指针“handle”传递给创建socket的函数
socket=new QSslSocket(this);
if(!socket->setSocketDescriptor(socketDescriptor)) {
qDebug() <<"setSocketError:"<<socket->error();
return;
}
qDebug()<<"ssl supported:"<<socket->supportsSsl();
qDebug()<<"peerAddress:"<<socket->peerAddress();
socket->addCaCertificates(Zm().sslCA+Zm().sslCACert);
socket->setPrivateKey(Zm().sslFiles+Zm().sslKey);
socket->setLocalCertificate(Zm().sslFiles+Zm().sslCert);
socket->setPeerVerifyMode(QSslSocket::VerifyPeer);
socket->startServerEncryption();
这是 QSslSocket,因此设置了一些证书选项并加密了连接。
问题是我的分叉服务器总是在服务器和客户端之间的连接关闭并且服务器使qApp->quit();
连接关闭是由具有disconnectFromHost的客户端发起的,在两端我可以看到套接字正在进入状态:QAbstractSocket::UnconnectedState,5秒后分叉的服务器使qApp->quit()结束并处于失效状态。
我认为我不明白的是: 当我使用 lsof 命令检查时,在我启动客户端和分叉服务器之后,它显示父服务器和子服务器都连接到客户端 - 父(21347),子(21351):
ccbox-dem 21347 7u IPv4 2439080 0t0 TCP *:4321 (LISTEN)
ccbox-dem 21347 8u IPv4 2442399 0t0 TCP localhost:4321->localhost:38669 (ESTABLISHED)
ccbox-big 21349 10u IPv4 2440519 0t0 TCP localhost:38669->localhost:4321 (ESTABLISHED)
ccbox-dem 21351 8u IPv4 2442399 0t0 TCP localhost:4321->localhost:38669 (ESTABLISHED)
并且在客户端关闭后,父服务器仍然连接到处于 CLOSE_WAIT 状态的客户端等待
ccbox-dem 21347 7u IPv4 2439080 0t0 TCP *:4321 (LISTEN)
ccbox-dem 21347 8u IPv4 2442399 0t0 TCP localhost:4321->localhost:38669 (CLOSE_WAIT)
“ps ax”命令显示子进程(21351)处于失效状态。
在子服务器启动后,我应该在父服务器中做什么来关闭此连接?还是这是其他问题?我需要摆脱这些已失效的进程
最好的问候
马雷克
【问题讨论】:
标签: c++ linux qt sockets networking