Les deux connect()
et les bind()
appels système «associent» le descripteur de fichier de socket à une adresse (généralement une combinaison ip / port). Leurs prototypes sont comme: -
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
et
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
Quelle est la différence exacte entre 2 appels? Quand faut-il utiliser connect()
et quand bind()
?
Plus précisément, dans certains exemples de codes de client de serveur, trouvé que le client utilise connect()
et que le serveur utilise l' bind()
appel. La raison n'était pas tout à fait claire pour moi.
c
sockets
network-programming
Siddhartha Ghosh
la source
la source
Réponses:
Pour mieux comprendre, découvrons où exactement lier et connecter entre en scène,
Suite au positionnement de deux appels, comme précisé par Sourav,
bind () associe le socket à son adresse locale [c'est pourquoi le côté serveur se lie, afin que les clients puissent utiliser cette adresse pour se connecter au serveur.] connect () est utilisé pour se connecter à une adresse [serveur] distante, c'est pourquoi c'est côté client , connect [lire comme: se connecter au serveur] est utilisé.
Nous ne pouvons pas les utiliser de manière interchangeable (même lorsque nous avons client / serveur sur la même machine) en raison de rôles spécifiques et de l'implémentation correspondante.
Je recommanderai en outre de corréler ces appels TCP / IP handshake.
Alors, qui enverra SYN ici, ce sera connect (). Alors que bind () est utilisé pour définir le point final de communication.
J'espère que cela t'aides!!
la source
The one liner:
bind()
à sa propre adresse,connect()
à une adresse distante.Citant la page de manuel de
bind()
et, de même pour
connect()
Clarifier,
bind()
associe le socket à son adresse locale [c'est pourquoi côté serveurbind
, afin que les clients puissent utiliser cette adresse pour se connecter au serveur.]connect()
est utilisé pour se connecter à une adresse [serveur] distante, c'est pourquoi, côté client, se connecter [lire comme: se connecter au serveur] est utilisé.la source
interchangeable
local
-> le processus lui-même,remote
-> l'autre processus.bind dit au processus en cours de réclamer un port. c'est-à-dire qu'il doit se lier au port 80 et écouter les demandes entrantes. avec bind, votre processus devient un serveur. lorsque vous utilisez connect, vous dites à votre processus de se connecter à un port qui est DÉJÀ utilisé. votre processus devient un client. la différence est importante: bind veut un port qui n'est pas utilisé (pour qu'il puisse le revendiquer et devenir un serveur), et connect veut un port qui est déjà utilisé (pour qu'il puisse s'y connecter et parler au serveur)
la source
De Wikipedia http://en.wikipedia.org/wiki/Berkeley_sockets#bind.28.29
relier():
L'appel système connect () connecte un socket, identifié par son descripteur de fichier, à un hôte distant spécifié par l'adresse de cet hôte dans la liste d'arguments.
Certains types de sockets sont sans connexion, le plus souvent des sockets de protocole de datagramme utilisateur. Pour ces sockets, connect prend une signification particulière: la cible par défaut pour l'envoi et la réception de données est définie à l'adresse donnée, permettant l'utilisation de fonctions telles que send () et recv () sur les sockets sans connexion.
connect () renvoie un entier représentant le code d'erreur: 0 représente le succès, tandis que -1 représente une erreur.
lier():
bind () assigne une socket à une adresse. Lorsqu'un socket est créé à l'aide de socket (), il ne reçoit qu'une famille de protocoles, mais pas d'adresse. Cette association avec une adresse doit être effectuée avec l'appel système bind () avant que le socket puisse accepter des connexions à d'autres hôtes. bind () prend trois arguments:
sockfd, un descripteur représentant le socket sur lequel effectuer la liaison. my_addr, un pointeur vers une structure sockaddr représentant l'adresse à laquelle se lier. addrlen, un champ socklen_t spécifiant la taille de la structure sockaddr. Bind () renvoie 0 en cas de succès et -1 si une erreur se produit.
Exemples: 1.) Utilisation de Connect
2.) Exemple de liaison:
J'espère que cela clarifie la différence
Veuillez noter que le type de socket que vous déclarez dépendra de ce dont vous avez besoin, c'est extrêmement important
la source
Je pense que cela vous aiderait à comprendre si vous pensez à
connect()
et enlisten()
tant que contreparties, plutôt qu'àconnect()
etbind()
. La raison en est que vous pouvez appeler ou omettrebind()
avant l'un ou l' autre, bien que ce soit rarement une bonne idée de l'appeler avantconnect()
, ou de ne pas l'appeler avantlisten()
.Si cela aide à penser en termes de serveurs et de clients, c'est
listen()
ce qui caractérise les premiers etconnect()
les seconds.bind()
peut être trouvé - ou introuvable - sur l'un ou l'autre.Si nous supposons que notre serveur et notre client sont sur des machines différentes, il devient plus facile de comprendre les différentes fonctions.
bind()
agit localement, c'est-à-dire qu'il lie la fin de la connexion sur la machine sur laquelle il est appelé, à l'adresse demandée et vous attribue le port demandé. Il le fait indépendamment du fait que cette machine soit un client ou un serveur.connect()
initie une connexion à un serveur, c'est-à-dire qu'il se connecte à l'adresse et au port demandés sur le serveur, à partir d'un client. Ce serveur aura presque certainement appelébind()
avantlisten()
, afin que vous puissiez savoir sur quelle adresse et quel port vous connecter en utilisantconnect()
.Si vous n'appelez pas
bind()
, un port et une adresse seront implicitement attribués et liés sur la machine locale pour vous lorsque vous appelezconnect()
(client) oulisten()
(serveur). Cependant, c'est un effet secondaire des deux, pas leur objectif. Un port ainsi attribué est éphémère.Un point important ici est que le client n'a pas besoin d'être lié, car les clients se connectent aux serveurs, et ainsi le serveur connaîtra l'adresse et le port du client même si vous utilisez un port éphémère, plutôt que de se lier à quelque chose de spécifique. D'un autre côté, bien que le serveur puisse appeler
listen()
sans appelerbind()
, dans ce scénario, il devra découvrir le port éphémère qui lui a été attribué et le communiquer à tout client qu'il souhaite s'y connecter.Je suppose que, comme vous le mentionnez,
connect()
vous êtes intéressé par TCP, mais cela se répercute également sur UDP, où le fait de ne pas appelerbind()
avant le premiersendto()
(UDP est sans connexion) entraîne également l'attribution et la liaison implicites d'un port et d'une adresse. Une fonction que vous ne pouvez pas appeler sans liaison estrecvfrom()
, qui retournera une erreur, car sans port attribué et adresse liée, il n'y a rien à recevoir (ou trop, selon la façon dont vous interprétez l'absence de liaison).la source
Trop long; Ne pas lire: la différence est de savoir si l'adresse / le port source (local) ou de destination est défini. En bref,
bind()
définissez la source etconnect()
définissez la destination. Indépendamment de TCP ou UDP.bind()
bind()
définir l'adresse locale (source) du socket. C'est l'adresse à laquelle les paquets sont reçus. Les paquets envoyés par le socket portent cela comme adresse source, de sorte que l'autre hôte saura où renvoyer ses paquets.Si la réception n'est pas nécessaire, l'adresse source du socket est inutile. Les protocoles comme TCP nécessitent la réception activée pour pouvoir envoyer correctement, car l'hôte de destination renvoie une confirmation lorsqu'un ou plusieurs paquets sont arrivés (c'est-à-dire un accusé de réception).
connect()
connect()
déclenche le code TCP pour essayer d'établir une connexion de l'autre côté.connect()
ne définissez qu'une adresse par défaut à laquelle les paquets sont envoyés lorsqu'aucune adresse n'est spécifiée. Quandconnect()
n'est pas utilisésendto()
ousendmsg()
doit être utilisé avec l'adresse de destination.Lorsqu'une
connect()
fonction d'envoi est appelée et qu'aucune adresse n'est liée, Linux lie automatiquement le socket à un port aléatoire. Pour plus de détails techniques, consultez leinet_autobind()
code source du noyau Linux.Notes d'accompagnement
listen()
est TCP uniquement.struct sockaddr_in
) est composée d'une adresse IP (voir en- tête IP ) et d'un port TCP ou UDP (voir en - tête TCP et UDP ).la source