Comment faire des Sockets de Domaine Unix différencier entre plusieurs clients?
TCP a le tuple paires (IP Addr/port/type) de dire à un client à partir d'un autre. UDP passe le client IP et le port. Comment le domaine unix garder une trace des différents clients?
En d'autres termes, le serveur crée un socket lié à un certain chemin par exemple /tmp/socket. 2 ou plusieurs clients de se connecter à /tmp/socket. Ce qui se passe en dessous qui garde une trace des données à partir de client1 et client2? J'imagine que la pile réseau ne joue aucun rôle dans les sockets de domaine est donc le noyau fait tout le travail ici?
Est là un domaine unix format du protocole comme il y a un protocole IP format et le protocole TCP/UDP formats? Est le format de socket datagramme protocoles publié quelque part? Est tous les unix différents ou fait quelque chose comme POSIX uniformiser?
Merci pour tout éclairage. Je ne pouvais pas trouver toutes les informations que l'a expliqué. Chaque source juste glosé sur la façon d'utiliser les sockets de domaine.
- Parler sur un domaine unix protocole est essentiellement d'e/s de fichier. à moins que les données que vous êtes en passant par le support contient l'identification de la source, il n'y a aucun moyen de dire le processus qui a envoyé une chaîne de caractères à travers.
- cela devrait être une réponse
- Peut-il être vrai? Si un serveur écrit des données le premier client qui lit obtient les données, peu importe si cela a été prévu pour que le client ou pas? Que de les rendre presque inutile.
- Ce que vous décrivez semble douteuse. Dans la page 449 5ème alinéa de l'
Linux Programming 2nd Edition Unleashed
parKurt Wall, et al
, il est indiqué ainsi:...with named pipes you cannot tell one process data from another. Using UNIX Domain sockets, you will get a separate session for each process.
Vous devez vous connecter pour publier un commentaire.
Si vous créez un
PF_UNIX
socket de typeSOCK_STREAM
, et accepter les connexions sur elle, puis chaque fois que vous acceptez une connexion, vous obtenez un nouveau descripteur de fichier (comme la valeur de retour de laaccept
appel système). Ce descripteur de fichier lit les données à partir et écrit des données sur un descripteur de fichier du processus client. Ainsi, il fonctionne comme une connexion TCP/IP.Il n'y a pas de domaine unix format du protocole”. Il n'y a pas besoin de l'être, parce qu'un Unix socket de domaine ne peut pas être connecté à un ordinateur via une connexion réseau. Dans le noyau, le descripteur de fichier représentant votre fin d'une
SOCK_STREAM
Unix socket de domaine pointe vers une structure de données qui indique au noyau qui descripteur de fichier est à l'autre bout de la connexion. Lorsque vous écrivez des données de votre descripteur de fichier, le noyau regarde le descripteur de fichier à l'autre extrémité de la connexion et ajoute les données à l'autre descripteur de fichier de la mémoire tampon de lecture. Le noyau n'a pas besoin de mettre vos données à l'intérieur d'un paquet avec un en-tête décrivant sa destination.Pour un
SOCK_DGRAM
socket, vous devez indiquer au noyau le chemin de la socket qui devraient recevoir vos données, et il l'utilise pour regarder le descripteur de fichier pour que la douille de réception.Si vous liez un chemin d'accès à votre client socket avant de vous connecter au serveur de socket (ou avant d'envoyer des données si vous utilisez
SOCK_DGRAM
), alors le processus serveur peut obtenir que le chemin à l'aide degetpeername
(pourSOCK_STREAM
). Pour unSOCK_DGRAM
, le récepteur peut utiliserrecvfrom
pour obtenir le chemin d'accès de l'envoi de socket.Si vous n'avez pas lier un chemin, alors que le processus de réception ne peut pas obtenir une id qui identifie de manière unique par les pairs. Au moins, pas sur le noyau Linux, je suis en cours d'exécution (
2.6.18-238.19.1.el5
).sock.sk_wmem_alloc
est incrémenté sur l'envoi de prise lors de l'envoi de données, alors que je m'attends à cesock.sk_rmem_alloc
être incrémenté par les pairs est prise à la place.