分叉进程和客户端之间断开连接

时间:2014-10-15 10:59:52

标签: c++ linux qt sockets networking

我在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-&gt; close()”是关闭子进程以侦听像父进程一样的端口,然后将指针“handle”传递给创建套接字的函数

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

问题是我的分叉服务器总是处于已解散状态“&lt; defunct&gt;“在服务器和客户端之间关闭连接后,服务器使qApp-&gt; quit();

连接关闭由具有disconnectFromHost的客户端启动,并且在两端我可以看到套接字正在进入状态:QAbstractSocket :: UnconnectedState,5秒后分叉服务器使qApp-&gt; 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)处于不存在状态。

在父服务器中,如何在子服务器启动后立即关闭此连接?或者这是另一个问题吗?我需要摆脱这些已经失效的过程

最好的问候

马立克

1 个答案:

答案 0 :(得分:1)

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