Bonjour,
Je travaille actuellement sur les sockets et je me sert de select() afin d'avoir un serveur qui peut accueillir plusieurs client.
La partie qui lit ce qui se passe sur le socket du serveur fonctionne correctement et je peux avoir plusieurs clients connectés, par contre la lecture des données provenant des différents client ne fonctionne pas. Dès qu'un de mes clients écrit quelque chose, mon serveur rentre dans une des conditions en boucle.
Condition qui pose problème
Donc avec cette condition, si un client se connecte et envoie des données (une seul fois, pas de boucle), mon serveur va entrer dans cette condition en boucle et m'afficher ce que le client à envoyé sans arrêt. Je n'arrive pas comprendre pourquoi pour le select() il y a encore des données à lire alors que le client n'envoie plus rien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part if (FD_ISSET(sock, &readfd)) readSock(ssl, buffR, buffRSize);
Boucle While
Méthode ReadSock
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 while(1) { FD_ZERO(&readfd); FD_SET(sock, &readfd); FD_SET(listen_sock, &readfd); fd_max = max(sock, listen_sock); printf("\n\n Attente \n\n"); err = select(fd_max+1, &readfd, 0, 0, 0); RETURN_ERR(err, "select()"); if (FD_ISSET(sock, &readfd)) readSock(ssl, buffR, buffRSize); if (FD_ISSET(listen_sock, &readfd)) { /* Socket for a TCP/IP connection is created */ sock = accept(listen_sock, (struct sockaddr*)&sa_cli, &client_len); RETURN_ERR(sock, "accept"); //close (listen_sock); printf ("Connection from %s, port %u\n", inet_ntoa(sa_cli.sin_addr), ntohs(sa_cli.sin_port)); /* TCP connection is ready. */ /* A SSL structure is created */ ssl = SSL_new(ctx); RETURN_NULL(ssl); /* Assign the socket into the SSL structure */ err = SSL_set_fd(ssl, sock); RETURN_ZER(err); /* Perform SSL Handshake on the SSL server */ err = SSL_accept(ssl); RETURN_SSL(err); /* Informational output (optional) */ printf("SSL connection using %s\n", SSL_get_cipher(ssl)); if(SSL_ENABLED) { /* Get the client s certificate (optional) */ client_cert = SSL_get_peer_certificate(ssl); if (client_cert != NULL) { printf ("Client certificate:\n"); str = X509_NAME_oneline(X509_get_subject_name(client_cert), 0, 0); RETURN_NULL(str); printf ("\t subject: %s\n", str); free (str); str = X509_NAME_oneline(X509_get_issuer_name(client_cert), 0, 0); RETURN_NULL(str); printf ("\t issuer: %s\n", str); free (str); X509_free(client_cert); } else { printf("The SSL client does not have certificate.\n"); } } } // end read } // end while
#define
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 void readSock(SSL* ssl,char buffR[], int buffRSize) { int err = SSL_read(ssl, buffR, buffRSize-1); RETURN_SSL(err); // RETURN_ZER(err); buffR[err] = '\0'; printf ("Received %d chars:'%s'\n", err, buffR); }
Je ne suis peut-être pas claire donc l'explication de mon problème. N'hésitez pas à me poser des questions. Je peux aussi mettre les autres parties du code serveur si nécessaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #define max(x,y) ((x) > (y) ? (x) : (y)) #define RETURN_NULL(x) if ((x)==NULL) exit(1) #define RETURN_ERR(err,s) if ((err)==-1) { perror(s); exit(1); } #define RETURN_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); exit(1); } #define RETURN_ZER(err) if ((err)== 0) { ERR_print_errors_fp(stderr); exit(1); }
En espérant que quelqu'un pourrait m'aiguiller.
Bonne journée,
palo
Partager