mga*_*mal 5 c unix sockets virtualization qemu
我有一个客户端应用程序通过QMP Unix域套接字与QEMU进程通信.有时在客户端在套接字连接上调用close()之后,'netstat -ap unix'仍会将其显示为CONNECTED状态.我检查close()调用的返回值,并成功返回值为0,但连接似乎仍然挥之不去.
由于QMP实际上并不支持其套接字上的多个连接,因此连接到套接字的所有后续调用都会失败,因为它们会无限期地等待延迟连接关闭.
有没有办法从代码中确保套接字真的关闭,有没有办法强制套接字关闭?
小智 -1
你可以通过setsockopt(2)选项尝试SO_LINGER,超时时间为0。这样,当你关闭套接字时,套接字被强制关闭,发送一个RST而不是进入FIN/ACK关闭行为。
SO_LINGER 选项的目的是控制调用函数 close(2) 时如何关闭套接字。此选项仅适用于面向连接的协议,例如 TCP。
内核的默认行为是允许 close(2) 函数立即返回给调用者。如果可能,任何未发送的 TCP/IP 数据都将被传输和交付,但不做任何保证。由于 close(2) 调用立即将控制权返回给调用者,因此应用程序无法知道最后一位数据是否已实际传递。
可以在套接字上启用 SO_LINGER 选项,以使应用程序阻塞在 close(2) 调用中,直到所有最终数据传递到远程端。此外,这可以向调用者保证两端都已确认正常的套接字关闭。如果失败,则会发生指示的选项超时,并向调用应用程序返回错误。
通过使用不同的 SO_LINGER 选项值可以应用最后一种场景。如果调用应用程序想要立即中止通信,可以在逗留结构中设置适当的值。然后,调用 close(2) 将启动通信链接的中止,丢弃所有挂起的数据并立即关闭套接字。