我正在编写一个客户端应用程序,它通过 Unix 域套接字连接到服务器进程。如果服务器进程没有运行,我希望客户端等到服务器启动并监听套接字上的连接。
目前,我在客户端中有一个重试循环,它每秒调用一次 connect(),直到它成功连接到套接字。
有没有我可以调用的函数,它会简单地阻塞,直到创建一个特定的命名套接字(例如“/var/mysock”)并将其绑定到服务器进程?
我正在编写一个客户端应用程序,它通过 Unix 域套接字连接到服务器进程。如果服务器进程没有运行,我希望客户端等到服务器启动并监听套接字上的连接。
目前,我在客户端中有一个重试循环,它每秒调用一次 connect(),直到它成功连接到套接字。
有没有我可以调用的函数,它会简单地阻塞,直到创建一个特定的命名套接字(例如“/var/mysock”)并将其绑定到服务器进程?
不是一个完整的答案,但是...
如果您在 Linux 上,该inotify
界面将让您捕获操作的前几个有用步骤:
unlink
'ing 一个剩余的前套接字将触发IN_DELETE_SELF
它。bind
IN_CREATE
'ing 将在父目录上触发。不幸的是,服务器connect
直到它“才能listen
”。虽然这是下一个合乎逻辑的步骤,但不能保证它会立即这样做。它看起来好像没有inotify
提供一个接口。
我知道这是一个非常古老的问题,但这可能会帮助通过谷歌到达这里的新人遇到同样的问题。
如果可移植性是一个问题,并且始终应该作为指导原则,那么您的做法是完全正确的。有时,显而易见的解决方案也是正确的解决方案。如果您担心connect()
如此频繁地尝试 a 的开销,请在您的 try 循环中改为stat()
在套接字上执行 a ,如果可行,请使用S_ISSOCK()
来自stat.h
. 只有当所有这些都是真的时,您才会尝试connect()
.
您唯一需要担心花哨的异步通知是客户端应用程序在等待服务器启动时是否可以或应该做其他工作。这并不典型,但我可以设想您可能想要这样做的情况。在这种情况下,我只需在单独的线程中进行连接尝试。如果您认为合适的话,我可以在这里讨论一些细微差别,但我认为对于简单的“等待服务器启动”类型的循环来说这有点过头了。