Bonjour,
je débute dans la programmation en C avec les sockets, et dans un ridicule exemple de serveur, la fonction bind ne se passe pas bien donc je voudrais contrôler ce que valent les termes de la struct sockaddr qui lui est passée en argument.
Je vous mets le code ci dessous si jamais quelqu'un peut m'expliquer pourquoi ça plante dans le bind.

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/* ceci est un essai pour comprendre ce qui se passe avec le net */
/* gcc snd.c -o snd */
/* mysocket = socket(int socket_family, int socket_type, int protocol); */
/* The protocol modules are grouped into protocol families like PF_INET, PF_IPX, PF_PACKET and socket types like SOCK_STREAM or SOCK_DGRAM */
/*  socket(2) creates a socket, connect(2) connects a socket to a remote socket address, the bind(2) function binds a socket to a local socket address, listen(2) tells the socket that new connections shall be accepted, and accept(2) is used to get a new socket with a new incoming connection. */
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#define MAXNOM 32
void renvoi(int s) ;
/* programme serveur */
main(argc,argv)
int argc ;
char *argv[] ;
{
int sd,lacc, nsd ;
struct sockaddr_in adsock, adacc; /* struc adresse internet */
struct hostent *hptr ;             /* infos recuperes sur le host */
struct servent *sptr ;                        /* infos recuperes sur le service */
char machine[MAXNOM+1] ;                 /* nom de la machine locale */
char *prog ;                            /*nom de ce programme */
char *mesg ;
prog = argv[0] ;
/* prendre les infos sur le service */
/* struct servent *getservbyname(const char *name, const char *proto); */
if((sptr = getservbyname("ftp","tcp")) == NULL ) {
         printf("probleme : service inconnu\n") ;
         exit(1) ;
         }
/* recuperer le nom de la machine locale */
gethostname(machine,MAXNOM) ;
/* DVA le 7/08/2008: */
printf("\nmachine=%s\n",machine);
/* prendre les infos sur la machine locale */
if((hptr = gethostbyname(machine)) == NULL) {
         printf("probleme : host inconnu\n") ;
         exit(1) ;
         }
bzero((char*)&adsock, sizeof(adsock));
/*initialiser la struct adsock avec les infos recuperes */
bcopy((char *)&hptr->h_addr,(char*)&adsock.sin_addr,hptr->h_length) ;
adsock.sin_family = AF_INET ;
/* recupere le numero du port */
adsock.sin_port = sptr->s_port ;
adsock.sin_addr.s_addr = INADDR_ANY ;
/* creer maintenant un socket */
if((sd = socket(AF_INET,SOCK_STREAM,0))<0) {
          printf("probleme lors de la creation de socket \n") ;
          exit(1) ;
          }
/* DVA le 7/08/2008: */
printf("socket Ok; sd=%d\n",sd);
/* on va faire un bind sur le socket */
/* mais avant y faudrait contrôler la sockaddr */
 
/* int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); */
 
if(bind(sd,(struct sockaddr *) &adsock ,sizeof(adsock) ) == -1 ) {
          printf("problème avec le bind\n") ;
          exit(1) ;
          }
/* initialiser la queue d'écoute */
listen(sd,5) ; /* backlog = 5 */
/* bouble d'attente de nouvelles connexions */
for(;;){
          lacc = sizeof(adacc) ;
          /* boucle d'accept */
          if((nsd = accept(sd, ( struct sockaddr * ) &adacc, &lacc)) < 0 )
                   {
                   /* adacc -> infos du client */
                   printf("erreur sur l'accept \n") ;
                   exit(1) ;
                   }
renvoi(nsd) ;
close(nsd);
}
}
/* fonction renvoi */
void renvoi(s)
int s ;
{
char buf[256];
char *fichier;
char f[20];
char *mesgptr;
char mesg[250];
int l, c;
FILE *fp ;
char line[250] ={0} ;
char *lineptr = NULL;
/* lire une requete */
if((l=read(s, buf, sizeof(buf))) <= 0)
          return ;
buf[l] = '\0' ;         /*fin de chaine */
fichier=f;
if (!strcmp(buf,"lion")) fichier = "lion" ;
if (!strcmp(buf,"cancer")) fichier = "cancer" ;
if (!strcmp(buf,"scorpion")) fichier = "scorpion" ;
if (!strcmp(buf,"taureau")) fichier = "taureau" ;
if (!strcmp(buf,"vierge")) fichier = "vierge" ;
if (!strcmp(buf,"poisson")) fichier = "poisson" ;
if (!strcmp(buf,"capricorne")) fichier = "capricorne" ;
if (!strcmp(buf,"balance")) fichier = "balance" ;
if (!strcmp(buf,"belier")) fichier = "belier" ;
if (!strcmp(buf,"verseau")) fichier = "verseau" ;
if (!strcmp(buf,"gemeaux")) fichier = "gemeaux" ;
if((fp=fopen(fichier,"r"))==NULL) {
         printf("erreur lors de l'ouverture du fichier\n");}
while(fgets(line,240,fp)){
                 write(s, line, strlen(line)) ;
                 }
return ;
}
/* fin */
Et voici le résultat des courses :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
david@david-desktop:~/Snet$ gcc snd.c -o snd
david@david-desktop:~/Snet$ ./snd
 
machine=david-desktop
socket Ok; sd=3
problème avec le bind
david@david-desktop:~/Snet$
merci d'y avoir jeté un oeil,
David