【发布时间】:2015-02-18 18:52:49
【问题描述】:
我有一个客户端应用程序通过 QMP Unix 域套接字与 QEMU 进程通信。有时,客户端在套接字连接上调用 close() 后,“netstat -ap unix”仍将其显示为 CONNECTED 状态。我确实检查了 close() 调用的返回值,它成功返回值为 0,但连接似乎仍然挥之不去。
由于 QMP 并不真正支持其套接字上的多个连接,因此所有后续连接到套接字的调用都会失败,因为它们会无限期地等待延迟连接被关闭。
有没有办法从代码中确定套接字真的关闭了,有没有办法强制套接字关闭?
【问题讨论】:
-
听上去QEMU服务器进程还没有完全读完最后一个send()的内容。如果您切换到使用 TCP 而不是域套接字会发生什么?行为有什么不同吗?
-
我刚才描述的行为不是 100% 可重现的,不幸的是,使用 TCP 对我来说不是一个选项。
-
我们能看到
netstat -ap的输出吗? -
我会冒险猜测它是套接字缓冲区中的待处理内容,因此从套接字读取可能会关闭它。
-
检查您是否没有通过
fork()/exec()或类似方法将 fd 泄漏到另一个进程中。使用fcntl(fd, F_SETFD, FD_CLOEXEC)确保这不是问题的根源。
标签: c sockets unix virtualization qemu