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