【问题标题】:Terminate a process and close all its opened listening ports终止进程并关闭所有打开的监听端口
【发布时间】:2019-05-29 18:23:49
【问题描述】:

在我的 Qt 应用程序上,我在一个单独的进程上运行一个外部可执行文件,如下所示:

QProcess *server = new QProcess();
server->start("./server.exe");

外部可执行文件在127.0.0.1 上启动服务器,侦听端口18383

然后在某个时候,我会像这样终止这个过程:

server->terminate();

问题在于,通过终止服务器进程,其使用的端口(即18383)多次保持打开状态。因此,当我尝试再次启动服务器时,我收到以下错误:

"Server -2 无法设置服务器。listen tcp :18383: bind: 每个套接字地址(协议/网络地址/端口)通常只允许使用一次。

如何终止进程并关闭所有打开的监听端口?

【问题讨论】:

  • terminate() 调用是否真的杀死了进程?
  • @Michael 好吧,有时我在终止进程时会收到这些错误:QProcess: Destroyed while process (" ... server.exe ...") is still running
  • 在这种情况下,进程对象在实际进程仍在运行时被销毁。您应该尝试优雅退出。
  • @Michael 谢谢!我将进一步研究QProcess 文档,看看我是否可以使用它的 API 来优雅地退出。
  • 尝试用SO_REUSEADDR打开你的端口,你可能会遇到监听端口保持打开一小段时间以允许接收飞行中的tcp数据包的情况

标签: c++ qt port


【解决方案1】:

有时我在终止进程时收到以下错误: QProcess:在进程(“ ... server.exe ...”)仍然存在时被销毁 运行

您似乎没有等待进程正常终止。 这是终止您启动的进程的通用方法:

server->terminate(); 
server->waitForFinished(timeoutMS);
if (server->state() == QProcess::Running) {
     server->kill();
}

Terminate 会发送一个礼貌的“请停止”信号,kill 会突然停止目标进程。服务器关闭需要多长时间(可能是几秒钟)?所以你应该有一个足够的超时时间来考虑这一点。

【讨论】:

  • 谢谢!错误QProcess: Destroyed while process is still running 得到了解决:) 但是,我不确定我是否会再次在tcp 端口上收到Server -2 错误。我希望我不会!
  • 如果服务器没有泄露网络资源应该没问题。
猜你喜欢
  • 2018-11-26
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
相关资源
最近更新 更多