gpt4 book ai didi

c++ - fork 进程和客户端之间断开连接

转载 作者:太空宇宙 更新时间:2023-11-04 11:02:38 25 4
gpt4 key购买 nike

我在 Linux 上使用 Qt 5.3。我有 QCoreApplication 服务器在 Linux 上运行,当来自客户端的新连接到达时,服务器会自行 fork 。

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,因此设置了一些证书选项并加密了连接。

问题是在服务器和客户端之间的连接关闭后,我的 fork 服务器总是以失效状态“ ”结束,并且服务器发出 qApp->quit();

连接关闭由带有 disconnectFromHost 的客户端发起,在两端我都可以看到套接字正在进入状态:QAbstractSocket::UnconnectedState,5 秒后 fork 的服务器使 qApp->quit() 并以失效状态结束。

我认为我不明白的是:当我使用 lsof 命令检查时,在我启动客户端和 fork 服务器之后,它显示父服务器和子服务器都连接到客户端 - parent(21347), child(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) 处于失效状态。

在子服务器启动后,我应该在父服务器中做什么才能立即关闭此连接?或者这是其他问题?我需要摆脱这些已失效的进程

最好的问候

马立克

最佳答案

要清理失效的进程,您必须等待它们。这里的任何功能都可以做:http://linux.die.net/man/2/wait - 这个想法是它们是“不存在的”,因为没有人等待它们完成,以获得它们的返回值。需要有人这样做,否则 children 会很难过并永远困扰着你。

关于c++ - fork 进程和客户端之间断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26380882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com