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

标签 c++ linux qt sockets networking

我在 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/

相关文章:

c++ - 构建 PHP 扩展时如何检查未损坏的 C++ 符号?

iphone - 错误 : 'class name' redeclared as different kind of symbol?

c++ - MFC Windows 菜单,自定义

java - 错误 : Could not find or load main class sample. 主要

c++ - QWizard::addPage() 上的 "QObject::connect: Attempt to bind non-signal Class::signal"警告

c++ - 如何修改我的Qt PaintEvent代码以相对于鼠标指针缩放显示的Pixmap

c++ - 在类中抛出异常的最佳方式是什么?

c - 在 if(0) block 内执行代码

linux - 如何独立于基于包的安装运行 PostgreSQL 设置?

c++ - 将类作为函数参数传递