Salut tout le monde
ça fait plus de 5 ans que je programme en C malgrès ça je me rends compte qu' il y a encore les suptilités du C qui m'échappent
j'ai 2 programmes un serveur et un client qui communiquent à l'aide de sockets ssl, le serveur attend les données provenant du client et les affiche. la premiere version du client marche bien mais la seconde ne marche pas, la seul différence ce que j'ai remplace les lignes suivantes :
par celle-ci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if (!fgets(buf, sizeof(buf), stdin)) break;
est-ce que c'est du à sizeof() ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 sprintf(buf,"message %d envoyé",i);
pour plus d'info voici les fonction en cause.
voici la fonction du serveur (pas de problème elle ne fais que affiche ce qu'elle reçoit) :
et voici la version (client) de la fonction qui marche
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 int do_server_loop(SSL *ssl) { int err, nread; char buf[80]; do { for (nread = 0; nread < sizeof(buf); nread += err) { err = SSL_read(ssl, buf + nread, sizeof(buf) - nread); if (err <= 0) break; } fprintf(stdout, "%s", buf); } while (err > 0); return (SSL_get_shutdown(ssl) & SSL_RECEIVED_SHUTDOWN) ? 1 : 0; }
et voici la version de la fonction qui ne marche 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 int do_client_loop(SSL *ssl) { int i, err, nwritten; char buf[80]; for(i = 1; i <= 10;i++) { if (!fgets(buf, sizeof(buf), stdin)) break; for (nwritten = 0; nwritten < sizeof(buf); nwritten += err) { err = SSL_write(ssl, buf + nwritten, sizeof(buf) - nwritten); if (err <= 0) return 0; } } return 1; }
quelqu'un comprend pourquoi dans la première version de do_client_loop
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 int do_client_loop(SSL *ssl) { int i, err, nwritten; char buf[80]; for(i = 1; i <= 10;i++) { sprintf(buf,"message %d envoyé",i); for (nwritten = 0; nwritten < sizeof(buf); nwritten += err) { err = SSL_write(ssl, buf + nwritten, sizeof(buf) - nwritten); if (err <= 0) return 0; } } return 1; }
le serveur affiche 10 fois ce qui est tapé alors que dans la seconde version le
serveur n'affiche rien ?
Merci
Partager