2010-04-30 3 views
1

J'ai affaire à un serveur buggé qui échoue parfois à accepter les connexions (mais laisse son socket d'écoute ouvert). C'est sur Linux avec des sockets de domaine Unix. Actuellement, la seule façon de détecter cela est qu'après l'envoi d'un tas de données, le tampon se remplit et bloque, et le serveur n'envoie aucune réponse. Ce mode de défaillance long-après-coup est difficile à distinguer des autres bogues - le serveur pourrait ne pas répondre pour d'autres raisons.Un client peut-il déterminer si le serveur a accepté() 'd un socket unix?

Spécialement pour les sockets de domaine unix, il semble que le noyau devrait savoir si accept() est survenu; est-il possible de trouver cela? Est-ce que le client peut bloquer jusqu'à ce que accept() arrive d'une façon ou d'une autre, ou au moins vérifier si c'est le cas?

Ceci est juste à des fins de débogage, il peut donc être un peu moche.

+1

Par défaut connecter bloquera jusqu'à ce que la connexion est acceptée. Je ne sais pas si je comprends votre question – nc3b

+3

@ nc3b: Non, 'connect()' bloque jusqu'à ce que la connexion soit établie et en attente dans le backlog d'écoute. C'est ce que fait le paramètre 'backlog' de l'appel' listen() '- il définit le nombre de connexions pouvant être en attente. – caf

Répondre

3

On dirait que la réponse est "non"; le noyau n'offre aucun moyen d'obtenir cette information.

(modifier le protocole n'est pas une réponse, car je débogage un protocole inchangeable préexistant)

3

Je dirais que la réponse était de changer le protocole afin que le serveur parle d'abord (comme SMTP, pas comme HTTP)

Le noyau accepte déjà prises avant que l'appel système accept() est fait; si elle n'arrive jamais, alors les prises se reposent dans un état d'attente. Il n'y a aucun moyen de distinguer cela du serveur acceptant la connexion mais ne parlant pas. C'est ainsi que les sockets BSD ont toujours fonctionné.

+0

ouais, malheureusement, je ne peux pas changer le protocole ou le serveur, ou il n'y aurait pas besoin de faire cela ;-) c'est juste quelque chose qui serait utile pour contourner le serveur visqueux. Je ne pense pas qu'il existe un moyen de le faire, mais le noyau sait en théorie si le fichier accept() est arrivé - sur un socket unix local - il suffit donc de demander si quelqu'un connaît le chemin. assez clairement, il serait impossible dans le cas TCP –

Questions connexes