Recv(...); comment intégré un timeout ?

Résolu
cs_paramotdam Messages postés 29 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 29 mai 2009 - 15 juin 2007 à 16:27
cs_paramotdam Messages postés 29 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 29 mai 2009 - 15 juin 2007 à 21:34
Bonjour,
Je suis débutant dans l'utilisation des sockets et j'aimerais amélioré un mini chat que j'ai trouvé sur ce site.
Sans passé par les détails, voici ma question :
Pour l'instant, j'ai :

while(continue)
{
    while(!kbhit())
    {  
                error = recv(sock, bufferRecv, sizeof(bufferRecv)-1, 0);
                if(error != (-1))
                {
                 bufferRecv[error] = '\0';
                 printf("Server dit : %s\n", bufferRecv);
                 }
                 ...
    }
    ...            // autres instructions
}

Ce que je veut c'est que quand on appuie sur une touche, sa éxécute les "autres instructions" et que sinon, si il y a des données dans le buffer (provenant d'un autre PC qui utilise send(...)), sa les affiches. Hors là, le programme passe le while(!kbhit) puid il s'arrête sur "error = recv(sock, bufferRecv, sizeof(bufferRecv)-1, 0);" car aucune donnée n'est reçu. Je veux alors qu'il y ait un timeout sur la fonction recv() :
si une donnée est reçu avant la fin du timeout, sa affiche "Server dit : tata" et si le timeout se passe en entier, que sa fasse les instructions suivantes.
J'espère que j'ai été assez clair,
Merci d'avance ;-)

Damien

5 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 4
15 juin 2007 à 18:30
Salut,

Sous windows, SO_RCVTIMEO n'est pas supporté, cf MSDN. Par contre, tu
peux utiliser ioctlsocket() et l'option FIONREAD pour savoir si des
données sont présentes dans le buffer de reception de ton socket.

Si tu restes sur l'idée d'un recv bloquant avec timeout, tu doit pouvoir le faire avec select().
3
cs_paramotdam Messages postés 29 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 29 mai 2009
15 juin 2007 à 16:32
J'ai oublié : j'ai trouvé sa http://www.developpez.net/forums/showthread.php?t=112098 .
Mais je ne comprend pas comme il faut faire...
0
cs_paramotdam Messages postés 29 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 29 mai 2009
15 juin 2007 à 18:57
Tout d'abord merci d'avoir répondu !

J'ai essayé avec ioctlsocket() mais sa marche pas :
(serveur :)
                        if(ioctlsocket(bufferRecv, FIONREAD, &argp) != (-1))
                        {
                            error = recv(csock, bufferRecv, sizeof(bufferRecv)-1, 0);
                            bufferRecv[error] = '\0';
                            color(12,0);
                            printf(">>>> CLIENT DIT: %s\n",bufferRecv);
                        }

Sa ne veut pas entrer dans mon "if".
Mon client exécute sa en partie :
(client :)
                        printf("<<<< CLIENT DIT: ");
                        fgets(bufferSend, sizeof(bufferSend), stdin);
                        error = send(sock, bufferSend, strlen(bufferSend), 0);

Si j'enlève le "if", le serveur reçoit bien les caractères.
Il me manque sûrement un truc dans mon code... mais quoi ?
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 4
15 juin 2007 à 21:04
Salut,

Le premier param n'est pas un buffer mais le socket concerné, faut revoir les params.

ioctlsocket peut ne pas planter mais ne pas avoir de donnée dans son buffer pour autant, donc le test != (-1) est mal approprié.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_paramotdam Messages postés 29 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 29 mai 2009
15 juin 2007 à 21:34
C'est bon sa marche ! Merci beaucoup aardman !
J'ai utilisé ioctlsocket comme tu m'a dit et j'avais fais une erreur dans ma fonction :
j'avais mis sa :
                        ioctlsocket(bufferRecv, FIONBIO, &argp);
                        error = recv(csock, bufferRecv, sizeof(bufferRecv)-1, 0);
alors qu'il fallait sa :
                        ioctlsocket(csock, FIONBIO, &argp);
                        error = recv(csock, bufferRecv, sizeof(bufferRecv)-1, 0);

Allez merci encore, a+ !

Damien
0