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!!
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!!
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]; };comme tu le vois sockaddr est moins parlante que sockaddr_in. Par conséquent, on utilise en général sockaddr_in.
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]; };
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^^
Ce n'est pas spécifique à Windows. Les sockets sont, à la base, une émanation d'Unix BSD.
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.
Oui, cela m'a un peu aidé.
Maintenant voila mon programme ( serveur ).
Dites moi ce que vous en pensez.
car étant débutante je ne suis pas sûre.
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; }
Mais quand je compile voici mes erreurs :
Quelqu'un peut-il m'aider????
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 *
Merci d'avance ^^
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!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager