IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Différence entre sockaddr et sockaddr_in


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 47
    Points : 18
    Points
    18
    Par défaut Différence entre sockaddr et sockaddr_in
    Bonjour, voilà je suis débutante en réseau, et disons qu'avec la prof que j'ai je n'ai pas réussi a comprendre les bases donc je suis vraiment bloquée, quelqu'un pourrait deja me dire la différence entre sockaddr et sockaddr_in??
    A l'aide!!

  2. #2
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 58
    Points : 49
    Points
    49
    Par défaut
    Bonjour,
    sockaddr et sockaddr_in sont deux structure différente qu'on trouve dans winsock2.h pour windows:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct sockaddr_in {
    	short	sin_family;
    	u_short	sin_port;
    	struct	in_addr sin_addr;
    	char	sin_zero[8];
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct sockaddr {
    	u_short sa_family;
    	char	sa_data[14];
    };
    comme tu le vois sockaddr est moins parlante que sockaddr_in. Par conséquent, on utilise en général sockaddr_in.
    Cependant il y a des fonctions qui utilise sockaddr et pour convertir tu sera obligé de faire un cast. Les deux structures étant similaires dans la mémoire ça ne posera pas de problèmes.
    Ce qu'il faut comprendre l'une est plus compréhensible que l'autre du fait fait de nom de variables qui ont un sens alors que l'autre tu devra te débrouiller pour stocker par exemple l'adresse.
    Mais du point de vu plus physique, dans la mémoire ces deux structures sont identiques.


    J'espere avoir bien expliquer sinon ben demande^^

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par stephane543 Voir le message
    Bonjour,
    sockaddr et sockaddr_in sont deux structure différente qu'on trouve dans winsock2.h pour windows:
    Ce n'est pas spécifique à Windows. Les sockets sont, à la base, une émanation d'Unix BSD.

    Citation Envoyé par bebediddl Voir le message
    Bonjour, voilà je suis débutante en réseau, et disons qu'avec la prof que j'ai je n'ai pas réussi a comprendre les bases donc je suis vraiment bloquée, quelqu'un pourrait deja me dire la différence entre sockaddr et sockaddr_in??
    C'est dû au fait que les sockets sont très anciens et que leur API a été définie à l'époque où l'on n'utilisait pas encore de langage complètement orienté objet en lui-même.

    sockaddr est, d'une manière générale, une structure décrivant une adresse réseau. sockaddr_in est, de manière plus spécialisée, une adresse « INTERNET », ou plus généralement, une adresse IP et un port. Sache qu'un réseau ne se gère pas forcément en TCP/IP. On a même attendu longtemps avant de le voir se généraliser sur les machines personnelles. Il y a eu l'âge d'or de Novell, les réseaux AppleTalk, etc. et bien sûr lesdits « sockets UNIX ».

    Il y a donc une structure sockaddr_xxxxx pour chaque famille de protocoles que ton système sait gérer. Et toutes ont en commun, en tant que premier membre, un champ contenant un code qui décrit justement de quelle famille il s'agit − celui-là même qui est défini dans sockaddr.

    Ensuite, comme le prototype de ta fonction en C est censé recevoir tout types d'adresses mais dérivant toutes d'un tronc commun, tu passes cette adresse en argument en la transtypant (castant) en sockaddr générique, et tu passes à côté la taille de ta structure car ta fonction ne la connaît pas a priori. De là, ta fonction va examiner ce premier champ, dont elle est sure qu'il est commun à toutes. Elle saura alors de quel type d'adresse il s'agit, et ce qu'elle peut lire.

    Il faut faire un tout petit peu d'histoire pour bien comprendre les raisons de cet état de fait que je développerai plus tard, si ça te chante.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 47
    Points : 18
    Points
    18
    Par défaut
    Oui, cela m'a un peu aidé.

    Maintenant voila mon programme ( serveur ).
    Dites moi ce que vous en pensez.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
     
    #include"define.h"
     
     
    int main(int argc, char *argv)
    {	int descripteur,b,acc,len,addrlen;
    	struct sockaddr_in sin,from;
    	struct sockaddr addr;
    	len=sizeof(from);
    	addrlen=sizeof(addr);
    	bzero((char*) &sin, sizeof(sin));
    	sin.sin_family=AF_INET;
    	sin.sin_addr.s_addr=INADDR_ANY;
    	sin.sin_port=0;
     
    	if((descripteur=socket(AF_INET,SOCK_STREAM,0))<0)
    	{	perror("socket");
    		exit(3);
    	}
    	if((b=bind(descripteur,(struct sockaddr *)&sin,sizeof(sin)))<0)
    	{	perror("bind");
    		exit(2);
    	}
    	listen(descripteur,1);
     
    	acc=accept(descripteur,(struct sockaddr *)&from,&len);
    	return 0;
    }
    car étant débutante je ne suis pas sûre.

    Mais quand je compile voici mes erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    berenice@berenice-laptop:~/Bureau/TP Réseau$ gcc -Wall serveur.c -o serveur
    serveur.c: In function ‘main’:
    serveur.c:33: warning: pointer targets in passing argument 3 of ‘accept’ differ in signedness
    /usr/include/sys/socket.h:214: note: expected ‘socklen_t * __restrict__’ but argument is of type ‘int *’
    Quelqu'un peut-il m'aider????

    Merci d'avance ^^

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ton compilateur te donne 1 avertissement (warning) et une erreur. Pour résoudre l'avertissement, fais une recherche sur la différence entre unsigned et signed pour ce qui concerne les types de variables. L'erreur te dit que tu as envoyé le mauvais type d'argument à une fonction, comme le message d'erreur te le dit, cette fonction attendait un argument de type sock-quelque chose mais que l'argument recu est de type int *. Voilà! Les messages d'erreurs ne sont pas toujours clairs mais ceux ci le sont profite-en! Et bon courage!

Discussions similaires

  1. Différence entre un "bidouilleur" et un Pro ?
    Par christ_mallet dans le forum Débats sur le développement - Le Best Of
    Réponses: 290
    Dernier message: 28/11/2011, 10h53
  2. Réponses: 5
    Dernier message: 11/12/2002, 12h31
  3. Différence entre TCP, UDP, ICMP
    Par GliGli dans le forum Développement
    Réponses: 1
    Dernier message: 13/09/2002, 08h25
  4. Différences entre jmp, jz, jnz, etc
    Par christbilale dans le forum Assembleur
    Réponses: 3
    Dernier message: 05/07/2002, 15h09
  5. Réponses: 3
    Dernier message: 07/05/2002, 16h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo