Question

Je suis en train d'écrire une application client qui se connecte à un processus de serveur via un socket de domaine Unix. Si le processus de serveur ne fonctionne pas, je veux que le client d'attendre jusqu'à ce que le serveur a démarré et est à l'écoute des connexions sur la prise.

Actuellement, j'ai une boucle de nouvelle tentative dans le client qui appelle connect () chaque seconde jusqu'à ce qu'il se connecte avec succès à la prise.

Y at-il fonction que je peux appeler qui simplement bloquer jusqu'à ce qu'une prise du nom particulier (par exemple « / var / MySock ») est créé et lié à un processus serveur?

Était-ce utile?

La solution

Pas une réponse complète, mais ...

Si vous êtes sous Linux, l'interface inotify vous permettra de piéger une des premières étapes utiles de l'opération:

  • unlink'ing une prise ancienne restes déclenchera une IN_DELETE_SELF sur elle.
  • bind'ing déclenche une IN_CREATE sur le répertoire parent.

Malheureusement, le serveur ne connect'able jusqu'à ce qu'il listen. Bien que ce soit la prochaine étape logique, il n'y a vraiment aucune garantie que cela fera tout de suite. Il ne semble pas que inotify fournit une interface pour cela.

Autres conseils

Je sais que c'est une question très ancienne, mais cela peut aider les nouveaux arrivants qui arrivent ici via Google avec le même problème.

Si la portabilité est une préoccupation, et comme principe directeur, il doit toujours être, alors la façon dont vous le faites est tout à fait correct. Parfois, la solution la plus évidente est la bonne. Si vous êtes préoccupé par la surcharge de tenter une connect() si souvent, dans votre boucle d'essai au lieu faire une stat() sur la prise et si cela fonctionne, vérifiez qu'il est vraiment une prise en utilisant la macro S_ISSOCK() qui vient de stat.h. Une seule fois tout ce qui est vrai ce que vous essayez le connect().

Le seul moment où vous devez vous soucier de notifications asynchrones de fantaisie est si l'application cliente peut ou devrait faire d'autres travaux alors qu'il attend que le serveur pour démarrer. Ce n'est pas typique, mais je peux imaginer des cas où vous voudrez peut-être le faire. Dans ce cas, je voudrais simplement avoir la tentative de connexion dans un thread séparé. Il y a des nuances ici que je peux entrer dans si vous sentez qu'il serait approprié, mais je pense qu'il est trop pour un simple « attendez que le serveur à venir en vie » boucle de type.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top