/ / Clarity sur la fonction de socket bind () - c, sockets

Clarté sur la fonction de socket bind () - c, sockets

Pendant que je lisais comment établir une connexion client / serveur TCP en C, j’avais un doute sur la fonction bind ().

J'ai lu que vous aviez besoin de cette fonction pour "lier" un socket que vous "avez créé à un IPEndPoint local, car la connexion client / serveur prend une paire de douilles, faite par LocalIP: LocalPort, RemoteIP: RemotePort. Ainsi mes questions sont:

  1. Que se passe-t-il et que fait le noyau quand unle client n'appelle pas bind (), mais appelle connect () immédiatement après la création d'un socket (c'est une chose courante; je le fais aussi dans un programme client, mais je ne comprends pas pourquoi je n'ai pas besoin de lier)?

    ... et par dessus tout ...

  2. Pourquoi un programme serveur appelle-t-il bind () en spécifiantINADDR_ANY comme adresse LocalIP? J'ai lu que cette constante est utile pour spécifier une adresse IP générique, c'est-à-dire que le serveur accepte les données de n'importe où sur Internet. Mais… s'agit-il d'une adresse IP locale ou indique-t-elle où les clients peuvent accéder au serveur? Je deviens très confus ...

Réponses:

3 pour la réponse № 1

1) Vous n'avez généralement besoin d'appeler Bind que si vous le souhaitezcréer un socket serveur. Il existe des cas où il est nécessaire d’établir un socket client, mais le plus souvent, cela n’est pas nécessaire pour un socket client. Si vous souhaitez attendre les connexions entrantes sur un certain port, vous devez vous y connecter. Si vous souhaitez vous connecter à une adresse IP ou à un port, il n’est pas nécessaire de vous lier. La liaison du socket serveur prend un accès exclusif au port TCP. Rien d'autre ne peut se connecter et se connecter à ce port jusqu'à la fermeture de votre application ou la fermeture du socket par vous.

2) Vous spécifiez quelle adresse IP sur le localordinateur à lier. Un seul ordinateur peut avoir plusieurs adresses IP. Votre ordinateur peut avoir une connexion filaire et sans fil. Chacun a sa propre adresse IP sur le réseau local. Vous pouvez vous lier spécifiquement à l’une de ces adresses IP et non à l’autre. Vous pourriez même avoir une application liée au port 473 (par exemple) sur une adresse IP et une application entièrement différente liée au port 473 sur l'autre IP. Si vous spécifiez INADDR_ANY, vous vous liez à toutes les adresses IP valides de la machine. Ainsi, peu importe l'adresse IP utilisée par le client pour vous contacter, cela fonctionnera.


4 pour la réponse № 2

Que se passe-t-il et que fait le noyau quand unle client n'appelle pas bind (), mais appelle connect () immédiatement après la création d'un socket (c'est une chose courante; je le fais aussi dans un programme client, mais je ne comprends pas pourquoi je n'ai pas besoin de lier)?

Lorsque vous établissez une connexion sortante sans lier au préalable le socket à un IP / port, le noyau choisira automatiquement une adresse IP source et un port en fonction des tables de routage et des ports disponibles.

Pourquoi un programme serveur appelle-t-il bind () en spécifiantINADDR_ANY comme adresse LocalIP? J'ai lu que cette constante est utile pour spécifier une adresse IP générique, c'est-à-dire que le serveur accepte les données de n'importe où sur Internet. Mais… s'agit-il d'une adresse IP locale ou indique-t-elle où les clients peuvent accéder au serveur? Je deviens très confus ...

Ce que vous "lisez" est inexact - l'adresse IP dans le sockaddr passée à bind() didn "t indique où le serveur acceptera les connexions de. Il indique quelle adresse IP locale du socketdevrait être attaché à. INADDR_ANY indique que vous souhaitez écouter les connexions sur le port spécifié sur toutes les adresses IP associées à la machine. Sur les serveurs avec plusieurs adresses IP, il est souvent utile de spécifier une adresse IP à bind() to, afin que d’autres sockets puissent être liés au même port sur d’autres IP. Il est également souvent utile de se connecter à un port sur localhost uniquement.