problème avec la fonction select()
Bonjour!
j'ai un petit problème pour utiliser la fonction select.
ce que je voudrais réussir à faire en fait c'est que mon client soit en attente d'évènements venant de la part du serveur et qu'il réagisse en fonction (si c'est un évènement d'écriture, de lecture... ou si trop de temps c'est écoulé...)
donc voilà ce que j'ai fait coté client:
Code:
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
| while(boolll==ON)
{
fd_set readfs;
FD_ZERO (&readfs); /* clears readfs */
FD_SET (sock, &readfs); /* adds a stream */
fd_set writefs;
FD_ZERO (&writefs); /* clears readfs */
FD_SET (sock, &writefs); /* adds a stream */
/* set the timer to 1.5 second */
struct timeval timeout;
timeout.tv_sec = 1; /* 1 s */
timeout.tv_usec = 5 * 100 * 1000; /* 500 ms */
int err2 = select (sock + 1, &readfs, &writefs, NULL, &timeout);
switch (err2)
{
case 0:
/* timeout */
boolll==OFF;
break;
case -1:
/* error */
puts ("error\n");
boolll==OFF;
break;
default:
/* stream event */
/* - data has been received */
if (FD_ISSET (sock, &readfs))
{
printf("lecture\n");
int err = SSL_read(ssl, buf, sizeof(buf)-1);
if (err <= 0)
{
perror("call to read\n");
exit(-5);
}
buf[err] = '\0';
printf ("Received %d chars:'%s'\n", err, buf);
}
/* - data has been sent */
if (FD_ISSET (sock, &writefs))
{
printf("ecriture\n");
int err = SSL_write(ssl, hello, sizeof(hello));
if (err <= 0)
{
perror("call to write\n");
exit(-5);
}
}
} |
coté serveur, j'ai ça :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
/* Receive data from the SSL client */
err = SSL_read(ssl, buf, sizeof(buf) - 1);
RETURN_SSL(err); buf[err] = '\0';
printf ("Received %d chars:'%s'\n", err, buf);
//////////////////////////////////////////////////////////////////////////
/* Send data to the SSL client */
err = SSL_write(ssl, "This message is from the SSL server",strlen("This message is from the SSL server"));
RETURN_SSL(err); |
et le client n'a pas l'air de se mettre en attente d'évènement lecture...
est ce que c'est du au fait que j'utilise SSL? ou alors est ce que j'ai raté un truc sur la fonction select?
merci par avance pour vos réponses
SSL et select c'est compliqué.
La raison fondamentale en est que SSL travaille sur des "records" alors que select travaille sur des flots d'octets. L'implication en est que c'est pas parce que select va retourner "il y a des données à lire" que les données "lues" suffisent à remplir le "records" attendu par SSL_read.
Vous trouverez des exemples notament
An Introduction to OpenSSL Programming (PartI) et (Part II)
Votre soucis est décrit dans part II.
- W