【问题标题】:disconnect between forked process and client分叉进程和客户端之间的断开连接
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2010-11-01
      • 2011-08-10
      • 2017-07-17
      • 2021-12-05
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多