【发布时间】: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数据包的情况