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

Code : Sélectionner tout - Visualiser dans une fenêtre à part
if (FD_ISSET(sock, &readfd)) readSock(ssl, buffR, buffRSize);
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.

Boucle While

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
Méthode ReadSock

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);
 
}
#define

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); }
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.

En espérant que quelqu'un pourrait m'aiguiller.

Bonne journée,
palo