Un bind( ) dans un prog client en mode TCP

Un bind( ) dans un prog client en mode TCP - C++ - Programmation

Marsh Posté le 10-02-2011 à 11:56:39    

Bonjour,
j'ai repris un code qui contient un bind( ) coté client en mode TCP. Cela me surprends car pour moi un client crée une socket puis utilise celle-ci pour se connecter au serveur. A quoi sert ce bind( ) dans le client ?
Merci d'avance pour votre aide.

Reply

Marsh Posté le 10-02-2011 à 11:56:39   

Reply

Marsh Posté le 10-02-2011 à 12:48:25    

Bonjour,
 
A binder la socket en question sur un port. Pour être plus spécifique, ca doit être pour spécifier que ta socket en émission part d'un port spécifique et pas d'un port aléatoire.
 
 
Sans autre indications sur le code ou l'usage de ce programme, je ne pense pas qu'on puisse te donner plus d'explications.


Message édité par ccp6128 le 10-02-2011 à 12:59:05
Reply

Marsh Posté le 10-02-2011 à 14:07:32    

D'accord. Voici grosso modo la fonction xconnect qui fait appel éventuellement à bind( ), puis à connect( ) de l'OS. xconnect( ) permet à l' appli client de se connecter au serveur.
 

Code :
  1. int xconnect(uint32_t daddr, unsigned short dport, uint32_t *saddr, unsigned short *sport, int proto, int stp0)
  2. si->src.sin_family = AF_INET;
  3.     si->src.sin_addr.s_addr = *saddr;
  4.     si->src.sin_port = htons(localPort);
  5.     si->dst.sin_family = AF_INET;
  6.     si->dst.sin_addr.s_addr = daddr;
  7.     si->dst.sin_port = htons(dport);
  8.     if ((*saddr || *sport) && (stp != sipdgram) ) {
  9.      if (::bind(sock, (sockaddr *)&si->src, sizeof(si->src))) {
  10.       err = sockerrno();
  11.       log(ERROR, "bind error: %s", sockstrerror(err));
  12.       goto osfail;
  13.      }
  14.     }
  15. if (isstream(si->stype) && connect(sock, (sockaddr *)&si->dst, sizeof(si->dst))) {
  16. // traitement erreur
  17. }


     
 
ce que je n'ai pas compris : mais quand est ce qu'on spécifie comme suit ( cad sans bind )  ? :
 

Code :
  1. serv_addr.sin_family = AF_INET ;
  2.   serv_addr.sin_addr.s_addr = inet_addr (IP) ;
  3.   serv_addr.sin_port = htons (PORT) ;
  4.   memset (&serv_addr.sin_zero, 0, sizeof(serv_addr.sin_zero));
  5.   s_cli = socket (PF_INET, SOCK_STREAM, 0) ;
  6.   err = connect (s_cli, (struct sockaddr *)&serv_addr, sizeof serv_addr) ;


 
là aussi on spécifie l'adresse source pour l'émission : IP et le port source : PORT (qui est défini en macro plus haut ..)


Message édité par razuki le 10-02-2011 à 14:09:24
Reply

Marsh Posté le 10-02-2011 à 14:12:55    

Nein.
 
Dans le premier cas, tu crées ta socket en lui passant une IP et un port source spécifiques, puis tu fais ton connect sur ton serveur distant.
 
Dans le second cas, tu ne spécifies pas d'IP et de port source, juste l'ip et le port distants => Ton OS lance la connexion via un port source aléatoire.

Reply

Marsh Posté le 10-02-2011 à 14:36:09    

aie ca doit être la fatigue ... lol Merci pour ton aide.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed