Bonjour,
J'ai ecris une petite fonction qui coupe une chaine de carractères et stocke les differentes parties dans un tableau.
Cela fonctionne trés bien en local, on peut envoyer autant de parties que l'on veut:
Mais le même code dans un contexte réseau ne fonctionne plus au dela de 3 parties, ce qui est genant
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 #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <arpa/inet.h> #include <stdlib.h> int separe_champs(char ch[],char **tab){ char * s; int nbmot=0,i; s=strtok(ch,"-"); tab[nbmot]=s; while (s != NULL){ s=strtok(NULL,"-"); if (s != NULL){ nbmot++; tab=realloc(tab,(nbmot+1)*sizeof(char*)); tab[nbmot]=s; } } for (i=0;i<=nbmot;i++){ printf("separe_champs: champs %d : %s\n",i, tab[i]); } printf("\n"); return(nbmot); } int main() { char var1[200]; char **tabchps; int i,n; printf("Entrez votre chaine :"); scanf("%s",var1); tabchps=malloc(sizeof(char*)); n=separe_champs(var1,tabchps); printf("\ntableau champs:\n"); for (i=0;i<=n;i++){ printf("champs %d : %s\n",i, tabchps[i]); } free(tabchps); printf("\n"); }
Le client envoi au serveur 5 chaine et le serveur separe les champs de la troisieme.
Quand je reparcours mon tableau dans le main le premier champs est null et fais uune erreur de segmentation apres!
Voici le serveur:
Et voici le client:
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139 #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <arpa/inet.h> #include <stdlib.h> #include <time.h> #include <dirent.h> #define MAXLINE 4096 /* max text line length */ #define BUFFSIZE 8192 /* buffer size for reads and writes */ /* Following shortens all the typecasts of pointer arguments: */ #define SA struct sockaddr int separe_champs(char ch[],char **tab); int main(int argc, char **argv) { int listenfd, connfd, n, i=0,nb=0; struct sockaddr_in servaddr, cliaddr; socklen_t len; char buff[MAXLINE+1], recvline[MAXLINE +1]; char entre[BUFFSIZE]; listenfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(25000); bind(listenfd, (SA *) &servaddr, sizeof(servaddr)); listen(listenfd, 10); printf("ecoute sur le port 25000 ...\n\n"); for ( ; ; ){ char **tablignes; char **tabchps; tabchps=malloc(sizeof(char*)); tablignes=malloc(5*sizeof(char*)); tablignes[0]=malloc(BUFFSIZE); tablignes[1]=malloc(BUFFSIZE); tablignes[2]=malloc(BUFFSIZE); tablignes[3]=malloc(BUFFSIZE); tablignes[4]=malloc(BUFFSIZE); len=sizeof(cliaddr); connfd = accept(listenfd, (SA *)&cliaddr, &len); printf("conexion de %s sur le port source %d\n",inet_ntop(AF_INET,&cliaddr.sin_addr,buff,sizeof(buff)),ntohs(cliaddr.sin_port)); /***************************** 1 *****************************************/ if ( (n = read(connfd, recvline, MAXLINE)) > 0) { recvline[n] = 0; } snprintf(tablignes[0],BUFFSIZE,recvline); printf("1: '%s' recu\n",tablignes[0]); snprintf(buff, MAXLINE, "1 OK"); write(connfd, buff, strlen(buff)); /****************************** 2 **********************************/ if ( (n = read(connfd, recvline, MAXLINE)) > 0) { recvline[n] = 0; } snprintf(tablignes[1],BUFFSIZE,recvline); printf("2: '%s' recu\n",tablignes[1]); snprintf(buff, MAXLINE, "2 OK"); write(connfd, buff, strlen(buff)); /***************************** 3 ***********************************/ if ( (n = read(connfd, recvline, MAXLINE)) > 0) { recvline[n] = 0; } snprintf(tablignes[2],BUFFSIZE,recvline); snprintf(entre, sizeof(entre), recvline); printf("3: '%s' recu\n",tablignes[2]); snprintf(buff, MAXLINE, "3 OK"); write(connfd, buff, strlen(buff)); /******************************* 4 **********************************/ if ( (n = read(connfd, recvline, MAXLINE)) > 0) { recvline[n] = 0; } snprintf(tablignes[3],BUFFSIZE,recvline); printf("4: '%s' recu\n",tablignes[3]); snprintf(buff, MAXLINE, "4 OK"); write(connfd, buff, strlen(buff)); /******************************* 5 *******************************/ if ( (n = read(connfd, recvline, MAXLINE)) > 0) { recvline[n] = 0; } snprintf(tablignes[4],BUFFSIZE,recvline); //fprintf(fmail,"Expediteur: '%s' recu\n",recvline); printf("5: '%s' recu\n",tablignes[4]); snprintf(buff, MAXLINE, "5 OK"); write(connfd, buff, strlen(buff)); /************************************************************/ nb=separe_champs(entre, tabchps); for (i=0;i<nb;i++){ //printf("il ya %d personnes en copie\n", nb); printf("main: champs %d : '%s'\n",i,tabchps[i]); } close(connfd); } } int separe_champs(char ch[],char **tab){ char * s; int nbmot=0,i; s=strtok(ch,";"); tab[nbmot]=s; while (s != NULL){ s=strtok(NULL,";"); if (s != NULL){ nbmot++; tab=realloc(tab,(nbmot+1)*sizeof(char*)); tab[nbmot]=s; } } for (i=0;i<=nbmot;i++){ printf("fonction:champs %d : %s\n",i, tab[i]); } printf("\n"); return(nbmot+1); }
J'ai retourné le truc dans tous les sens je ne comprend pas.
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 #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define MAXLINE 4096 /* max text line length */ #define BUFFSIZE 8192 /* buffer size for reads and writes */ /* Following shortens all the typecasts of pointer arguments: */ #define SA struct sockaddr int main(int argc, char **argv) { int sockfd,n; char var1[200]; char buff[MAXLINE], recvline[MAXLINE + 1], recvline2[MAXLINE + 1]; struct sockaddr_in servaddr; if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) printf("socket error"); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(25000); /* daytime server */ if (inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr) <= 0) printf("inet_pton error for 127.0.0.1"); if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0) { perror("Impossible de se connecter au serveur!"); exit(0); } snprintf(buff, sizeof(buff),"rien");write(sockfd,buff,strlen(buff)); if ( (n = read(sockfd, recvline, MAXLINE)) > 0) { recvline[n] = 0; /* null terminate */ printf("reçu:%s\n",recvline); } snprintf(buff, sizeof(buff),"rien");write(sockfd,buff,strlen(buff)); if ( (n = read(sockfd, recvline, MAXLINE)) > 0) { recvline[n] = 0; /* null terminate */ printf("reçu:%s\n",recvline); } printf("Entrez la ligne avec ';' pour separateur: "); // copie a scanf("%s",var1); printf("envoi du champs copie a\n"); snprintf(buff, sizeof(buff),var1); write(sockfd,buff,strlen(buff)); if ( (n = read(sockfd, recvline, MAXLINE)) > 0) { recvline[n] = 0; /* null terminate */ printf("reçu:%s\n",recvline); } snprintf(buff, sizeof(buff),"rien");write(sockfd,buff,strlen(buff)); if ( (n = read(sockfd, recvline, MAXLINE)) > 0) { recvline[n] = 0; /* null terminate */ printf("reçu:%s\n",recvline); } snprintf(buff, sizeof(buff),"rien");write(sockfd,buff,strlen(buff)); if ( (n = read(sockfd, recvline, MAXLINE)) > 0) { recvline[n] = 0; /* null terminate */ printf("reçu:%s\n",recvline); } return(EXIT_SUCCESS); }
Partager