2009-09-03 27 views
3

我在写一个客户端应用程序,它通过一个Unix域套接字连接到一个服务器进程。如果服务器进程没有运行,我希望客户端等待服务器启动并且正在监听套接字上的连接。等待一个Unix域套接字被绑定

目前我在客户端有一个重试循环,每秒调用connect()直到成功连接到套接字。

是否有任何函数可以调用,直到创建一个特定的命名套接字(例如“/ var/mysock”)并将其绑定到服务器进程时,这些函数才会被阻塞?

回答

2

不是一个完整的答案,但...

如果你在Linux中,inotify界面会让你陷阱操作的前几个有用的步骤:

  • unlink“荷兰国际集团剩下的前套接字将触发它上面的IN_DELETE_SELF
  • bind'ing将在父目录上触发IN_CREATE

不幸的是,服务器不是connect'能够,直到它listen的。虽然这是下一个合乎逻辑的步骤,但它不能保证它马上就能完成。它看起来好像inotify提供了一个接口。

+0

感谢您的有用建议 - 这绝对是一个开始。我需要能够支持Solaris和Linux,尽管Solaris似乎有一个类似的功能叫做FAM。 – James 2009-09-04 01:41:57

1

我知道这是一个非常古老的问题,但这可能有助于新手通过Google来到这里,并且遇到同样的问题。

如果便携性是一个问题,并且作为一个指导原则,它应该始终如一,那么您的行为方式是完全正确的。有时候,明显的解决方案也是正确的。如果您担心如此频繁地尝试connect()的开销,请在您的尝试循环中改为在套接字上执行stat(),如果可行,请使用来自stat.hS_ISSOCK()宏验证它是否是套接字。只有这一次是真的,你才会尝试connect()

您唯一需要担心的奇怪异步通知是如果客户端应用程序可以或应该在等待服务器启动时执行其他工作。这不是典型的,但我可以设想你可能想要这样做的情况。在这种情况下,我只需在一个单独的线程中尝试连接。如果您认为这样做会很合适,我可以在这里找到一些细微之处,但我认为对于一个简单的“等待服务器启动”类型循环来说是过度的。