2009-09-25 5 views
2

Un client en poussant des données via une socket de domaine UNIX (type AF_UNIX) peut-il être signalé occupé si l'extrémité réceptrice ne peut pas faire face à la charge? ProtocoleSocket de domaine UNIX: existe-t-il un signal "occupé"?

OU

Faut-il être un client-serveur au-dessus de la prise pour gérer le contrôle de flux?

Répondre

0

Si vous n'incluez pas cela dans le protocole, le serveur n'a aucun moyen d'indiquer au client d'interrompre l'envoi des informations.

+0

Ainsi, les sockets sont des FIFO sans contrôle de flux: un protocole de couche supérieure est nécessaire pour le contrôle de flux (si nécessaire). – jldupont

+0

TCP/IP ne sait pas trop. Écrire un gestionnaire pour les messages de contrôle (vous devez aussi les écrire) est la seule façon de le faire. – Alex

+2

@ Jean-Lou: c'est correct. 'AF_UNIX' ne fournit absolument aucune sémantique de contrôle de flux. Le périphérique sous-jacent peut fournir des conditions de débordement de tampon entraînant le renvoi d'une erreur par 'send()', mais qui est spécifique au périphérique. –

-2

Autre que le serveur ayant une certaine connaissance du moment où il est «occupé» et renvoyant un signal spécifique (par exemple, le service HTTP 503 non disponible). Vous pouvez également configurer la connexion côté client au délai d'expiration après un certain laps de temps, et si vous obtenez un événement timeout, interprétez-le lorsque le serveur est occupé.

+0

... et ce comportement est générique pour les sockets en général * ou * spécifique à AF_INET? (Je demande à cause de votre exemple en utilisant HTTP) – jldupont

+0

PS l'ETIMEDOUT est ce que vous obtiendriez de l'appel de socket 'connect' s'il n'était pas capable d'établir une connexion dans le délai imparti; setsockopt SO_SNDTIMEO avec une heure est la façon dont vous configureriez cela (si vous ne vouliez pas la valeur par défaut). – AlBlue

+1

Là encore, l'hôte pourrait être en panne. Avoir votre client assis dans ce genre d'état est très trompeur pour ceux qui surveillent le processus. (en supposant que sa mission est critique) – Alex

8

Vous pouvez certainement effectuer un envoi bloquant vers une socket de domaine UNIX. Si le tampon de réception du côté de réception est plein, ou si le nombre de tampons de socket d'envoi en attente (non remis) est trop élevé, l'expéditeur bloque.

SOCK_STREAM Les sockets de domaine UNIX fonctionnent comme des sockets TCP. SOCK_DGRAM Les sockets de domaine UNIX fonctionnent comme UDP, sauf que les datagrammes de domaine UNIX ont une livraison en ordre garantie, tandis que les sockets UDP peuvent être réordonnés ou supprimés. (De plus, les Sockets de domaine UNIX peuvent être utilisés pour envoyer des descripteurs de fichiers et transmettre des informations d'identification entre processus, ce qui ne peut être fait avec TCP, UDP ou pipes.)

types de Sockets UNIX, le récepteur peut simplement arrêter de recevoir quand il est occupé à faire d'autres choses, et l'expéditeur sera automatiquement bloqué quand il n'y a plus d'espace tampon disponible (ou sera notifié qu'il n'y a plus d'espace tampon, opération de blocage sur leur socket). Ensuite, lorsque le destinataire commencera à recevoir à nouveau, l'expéditeur sera autorisé à envoyer plus.

+0

Existe-t-il un moyen d'utiliser XON/XOFF? – CMCDragonkai

+0

Vous pouvez utiliser n'importe quel protocole par-dessus, et cela peut inclure l'envoi de caractères XON/XOFF. Mais le noyau ne fera rien de spécial avec eux pour vous. Il les passe juste comme n'importe quel autre octet. – jtchitty

Questions connexes