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