Serveur vs Client Socket (détails de Bas niveau)?
La Programmation en général: Dans un serveur de socket accept() la méthode de ce qui se passe exactement. Au niveau de la façon dont les sockets serveur sont différents sockets client?
OriginalL'auteur S M Kamran | 2009-04-21
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, le serveur de sockets sont généralement liés à des noms bien connus (les ports, dans ce cas) et qu'ils établissent eux-mêmes avec
listen()
. C'est là la vraie différence qui se passe, comme sockets client établir eux-mêmes avecconnect()
. L'appel delisten()
sur un socket provoque le noyau de l'implémentation de tcp/ip pour commencer à accepter les connexions envoyé à la prise du nom lié (port). Ce sera le cas si oui ou non vous appeleraccept()
.accept()
donne simplement votre serveur un moyen d'accéder et d'interagir avec les sockets client qui ont été connectés à votre socket d'écoute.OriginalL'auteur Jason Coco
À un bas niveau les sockets sont juste sockets indépendamment du fait qu'ils sont utilisés dans une application serveur ou client. La différence entre les deux réside dans le système d'appels chaque type d'application.
Les sockets serveur va appeler
bind()
être associée à un port. Ils veulent être associés à un port afin que d'autres programmes de savoir où les atteindre. Sockets Client peut appelbind()
mais presque jamais le faire, car il n'y a pas beaucoup de point. Si un socket à ne pas faire appelbind()
l'OS il suffit de choisir un port éphémère pour elle, ce qui est bien pour les clients parce qu'ils sont en train de faire l'appel; on ne besoins à les appeler.Les sockets serveur d'appel
listen()
. Cela s'explique assez bien dans les autres réponses.Les sockets serveur d'appel
accept()
et je pense que c'est le point essentiel de votre question, parce que c'est un peu mystérieux au premier abord. La chose importante à comprendre, c'est que dans l'appel deaccept()
le noyau qui permettra de passer de nouveau un nouveau socket. Il est maintenant séparée de l'original de la socket d'écoute et est ce que votre serveur utilise pour communiquer avec ses pairs(s).La clé dans la compréhension de la façon dont la socket d'écoute continue à écouter alors que l'on a accepté la connexion est en train de faire sa chose, il faut comprendre que les connexions tcp dépend d'un 4-tuple (1) de l'adresse locale (2) port local (3) adresse à l'étranger (4) port étranger. Elles définissent un lien unique. Avant
accept()
passé le nouveau socket, le noyau utilisé ces valeurs pour créer différentes structures ainsi que, en collaboration avec la pile tcp/ip de tout le trafic avec ce tuple ira pour le socket connecté. Même si votre serveur peut-être un millier de contacts avec les adresse 192.168.1.100 le port 80, le client combinaison de l'adresse et du port sera toujours différent et donc le tuple est toujours unique.OriginalL'auteur Duck
Si vous êtes vraiment intéressé, alors je vous conseille de lire TCP/IP Illustré, Volume 2. Si vous voulez un moins "dans les tripes" réponse, alors:
socket()
système d'appels et le traitement de l'information spécifiée dans lebind()
appel système.listen()
appel système, la pile réseau crée une file d'attente dans laquelle les connexions en attente sont placés dans des. Une allusion à la taille de la file d'attente est donné comme lebacklog
paramètrelisten()
.accept()
de tirer une nouvelle connexion à partir de la file d'attente.connect()
et l'envoi des données à l'aide desend()
ouwrite()
.connect()
, une connexion est poussé sur le côté serveur de file d'attente où il se trouve jusqu'à ce que le serveur accepte la connexion.Cette description n'est vraiment valable que pour les sockets TCP/IP. L'UDP cas est plus simple et tout à fait différent puisque les sockets UDP ne sont pas (nécessairement) connecté.
OriginalL'auteur D.Shawley
Il est difficile de répondre à votre question sans spécification d'un langage de programmation. Je vais répondre à l'égard de python, parce que pour tout ce que je sais la réponse pourrait être représentant.
Si
s
est unsocket
objet, un serveur se lie à un port en appelants.bind(('',12345))
. Cela crée une socket en mode serveur. Il est prêt à attraper des données sur le port 12345.Puis on appelle
s.listen(10)
. Cela jette le socket en mode serveur. Cela signifie qu'une demande de connexion sera reçu par cette prise (jusqu'à 10 demandes en attente à un moment).Par le temps nous arrivons à
s.accept()
, le système d'exploitation sait déjà que nous sommes à l'écoute sur le port 12345.s.accept()
simplement dit ce que nous allons faire avec les demandes que nous recevons. En python,s.accept()
sera de retour(connection,address)
où la connexion est une connexion via un autre port. Dans ce cas,connection
n'est pas très différente de la prise de l'objet que le client a ouvert. Il est assez symétrique à partir d'ici.OriginalL'auteur David Berger