Sockets Unix: quand utiliser la fonction bind ()?
Je n'ai pas une idée claire sur le moment j'utilise le bind() de la fonction.
Je suppose qu'il doit être utilisé chaque fois que j'ai besoin de recevoir des données (c'est à dire recv() ou recvfrom ()) si je suis en utilisant TCP ou UDP, mais quelqu'un m'a dit ce n'est pas le cas.
Quelqu'un peut préciser un peu?
MODIFIER j'ai lu les réponses, mais en fait, je ne suis pas si clair. Prenons un exemple où j'ai un client UDP qui envoie les données au serveur, et enfin obtenir une réponse. J'ai utiliser bind ici, non?
source d'informationauteur The Coding Monk
Vous devez vous connecter pour publier un commentaire.
Cette réponse est un peu longue haleine, mais je pense que ça va aider.
Quand nous faisons des réseaux informatiques, nous sommes vraiment juste en faisant de communication inter-processus. Permet de dire sur votre propre ordinateur, vous aviez deux programmes qui voulait parler les uns aux autres. Vous pouvez utiliser le tuyau pour envoyer les données d'un programme à un autre. Quand vous dites
ls | grep pdf
vous prenez la sortie dels
et de la nourrir engrep
. De cette façon, vous avez unidirectionnel de la communication entre les deux programmes distinctsls
etgrep
.Lorsque vous faites cela, quelqu'un a besoin de garder une trace de l'ID de Processus (PID) de chaque processus. Ce PID est un identificateur unique pour chaque processus, et il nous aide à savoir qui a la "source" et "destination" sont les processus pour les données à transférer.
Alors maintenant, disons que vous avez données à partir d'un serveur web que vous souhaitez transférer à un navigateur. Eh bien, c'est le même scénario que précédemment - interprocess communication entre deux programmes, le "serveur" et "navigateur".
Sauf que cette fois ces deux programmes sont sur des ordinateurs différents. Le mécanisme pour la communication interprocessus sur deux ordinateurs sont appelés des "sockets".
Si grand. Vous prenez certaines données, lob sur le fil, et de l'autre ordinateur reçoit. Sauf que l'ordinateur ne sait pas quoi faire avec ces données. Rappelez-vous, nous avons besoin d'un PID de connaître les processus qui sont en train de communiquer? La même chose est vraie dans la mise en réseau. Lorsque votre ordinateur reçoit les données HTML, comment sait-elle de l'envoyer à "firefox" plutôt que de "pidgin"?
Bien lorsque vous transmettez des données du réseau, vous pouvez spécifier qu'il va sur un "port". Le Port 80 est généralement utilisé pour le web, le port 25 pour telnet sur le port 443 pour HTTPS, etc.
Et que le "port" est lié à un ID de processus sur la machine. C'est pourquoi nous avons ports. C'est pourquoi nous utilisons
bind()
. Afin de vous en informer l'expéditeur que le processus devrait recevoir nos données.Ce qui peut expliquer les réponses que les gens ont posté. Si vous êtes un expéditeur, vous ne vous souciez pas de ce que le port de départ est, vous n'avez généralement pas utiliser
bind()
pour spécifier ce port. Si vous êtes un récepteur, eh bien, tout le monde doit savoir où chercher pour vous. Si vousbind()
votre programme pour le port 80, puis dites à tout le monde pour s'assurer de transmettre des données.Pour répondre à vos hw question, oui, vous voudrez probablement utiliser bind() de votre serveur. Mais les clients n'ont pas besoin d'utiliser bind() - ils ont juste besoin de s'assurer qu'ils transmettent des données à n'importe quel port que vous avez choisi.
Après la lecture de mise à jour de votre question. Je suggère de ne pas utiliser
bind()
fonction tout en faisant des appels de client. La fonction est utilisée lors de l'écriture de votre propre serveur, pour lier le support (créé après avoir fait un appel àsocket()
) à une adresse physique.Pour plus de vous aider à examiner ce tutoriel
bind()
est utile lorsque vous écrivez un serveur qui attend les données des clients par "l'écoute" à un port. Avecbind()
vous êtes en mesure de spécifier le port sur lequel vous allezlisten()
avec le même socket.Si vous écrivez le client, il n'est pas nécessaire pour vous d'appeler
bind()
-- vous pouvez simplement appelerrecv()
pour obtenir les données envoyées par le serveur. Votre port local sera mis à la une "éphémère" valeur lors de la connexion TCP est établie.Vous utilisez
bind
chaque fois que vous souhaitez lier à une adresse locale. Vous principalement l'utiliser pour l'ouverture d'un socket en écoute sur une adresse spécifique/port, mais il peut également être utilisé pour fixer l'adresse et le port d'une connexion TCP sortante.vous devez appeler bind() uniquement dans votre serveur. Il est nécessaire, en particulier pour la liaison d'un #port à votre support.