11
votes

Sockets UNIX: quand utiliser la fonction BIND ()?

Je n'ai aucune idée claire lorsque je dois utiliser la fonction BIND (). Je suppose que cela devrait être utilisé chaque fois que je dois recevoir des données (I.E. RECV () ou RECVFROM ()) Que j'utilise TCP ou UDP, mais quelqu'un m'a dit que ce n'est pas le cas.

Quelqu'un peut-il clarifier un peu?

EDIT J'ai lu les réponses mais je ne suis pas si claire. Prenons un exemple où j'ai un client UDP qui envoie les données au serveur, puis pour obtenir une réponse. Je dois utiliser lier ici, non?


1 commentaires

J'ai édité la réponse pour ajouter un exemple sur lequel j'ai besoin de clarification


5 Réponses :


1
votes

BIND () est utile lorsque vous écrivez un serveur qui attend des données de clients en "écoute" à un port connu. Avec BIND () Vous pouvez définir le port sur lequel vous allez écouter () avec la même prise.

Si vous écrivez le client, il n'est pas nécessaire que vous puissiez appeler Bind () - Vous pouvez simplement appeler recv () pour obtenir les données envoyées de le serveur. Votre port local sera défini sur une valeur «éphémère» lorsque la connexion TCP est établie.


0 commentaires

1
votes

Vous utilisez Bind quand vous souhaitez lier à une adresse locale. Vous utilisez principalement ceci pour ouvrir une prise d'écoute sur une adresse / port spécifique, mais elle peut également être utilisée pour corriger l'adresse / le port d'une connexion TCP sortante.


0 commentaires

0
votes

Vous devez appeler BIND () uniquement sur votre serveur. Il est nécessaire surtout pour la liaison A #Port à votre prise.


0 commentaires

22
votes

Cette réponse est un peu collée, mais je pense que cela aidera.

Lorsque nous effectuons une mise en réseau informatique, nous faisons vraiment une communication inter-processus. Disons sur votre propre ordinateur que vous avez eu deux programmes qui souhaitaient se parler. Vous pouvez utiliser un tuyau pour envoyer les données d'un programme à un autre. Quand vous dites ls | grep pdf Vous prenez la sortie de ls et l'alimentant dans grep . De cette manière, vous avez une communication unidirectionnelle entre les deux programmes distincts ls et grep .

Lorsque vous faites cela, une personne doit garder une trace de l'ID de processus (PID) de chaque processus. Ce PID est un identifiant unique pour chaque processus et nous aide à suivre que les processus "source" et "destination" sont destinés aux données que nous voulons transférer.

permet donc maintenant de dire que vous avez des données d'un serveur Web que vous souhaitez transférer sur un navigateur. Eh bien, il s'agit du même scénario que ci-dessus - Communication interprocessé entre deux programmes, le "serveur" et "navigateur".

Sauf cette fois ces deux programmes sont sur différents ordinateurs. Le mécanisme de communication interprocessive sur deux ordinateurs s'appelle des "prises".

si génial. Vous prenez des données, lobez-la sur le fil et l'autre ordinateur le reçoit. Sauf que cet ordinateur ne sait pas quoi faire avec ces données. Rappelez-vous que nous avons dit que nous avions besoin d'une PID pour savoir quels processus communiquent-ils? La même chose est vraie dans la mise en réseau. Lorsque votre ordinateur reçoit des données HTML, comment sache-t-elle de l'envoyer à "Firefox" plutôt que "Pidgin"?

Eh bien, lorsque vous transmettez des données de réseau, vous spécifiez qu'il va sur un "port" spécifique. Le port 80 est généralement utilisé pour Web, Port 25 pour Telnet, Port 443 pour HTTPS, etc.

et que "port" est lié à un identifiant de processus spécifique sur la machine. C'est pourquoi nous avons des ports. C'est pourquoi nous utilisons bind () . Afin de dire à l'expéditeur quel processus devrait recevoir nos données.

Cela devrait expliquer les réponses que les gens ont affiché. Si vous êtes un expéditeur, vous ne vous souciez pas de ce que le port sortant est, vous n'utilisez donc généralement pas Bind () pour spécifier ce port. Si vous êtes un destinataire, tout le monde doit savoir où chercher vous. Donc, vous BIND () Votre programme au port 80, puis dites à chacun de vous assurer de transmettre des données là-bas.

Pour répondre à votre question HW, oui, vous souhaitez probablement utiliser BIND () pour votre serveur. Mais les clients n'ont pas besoin d'utiliser BIND () - ils doivent simplement s'assurer qu'ils transmettent des données sur n'importe quel port que vous avez choisi.


0 commentaires

14
votes

Après avoir lu votre question mise à jour. Je suggérerais de ne pas utiliser Bind () Fonction lors de l'appels client. La fonction est utilisée lors de la rédaction de votre propre serveur, pour lier la prise (créée après avoir effectué un appel sur socket () ) à une adresse physique.

Pour plus d'aide Voir ce Tutoriel

modèle de serveur client


0 commentaires