4 votes

C++ socket Windows

J'ai une question. Je crée un socket, je me connecte, j'envoie des octets, tout est ok.

et pour recevoir des données, j'utilise la fonction recv.

char * TOReceive= new char[200];

recv(ConnectSocket, TOReceive , 200, 0);

lorsqu'il y a des données, il les lit et les renvoie, avec succès, et lorsqu'il n'y a pas de données, il attend les données, tout ce dont j'ai besoin est de limiter le temps d'attente Par exemple, si aucune donnée n'a été reçue pendant 10 secondes, le message doit être renvoyé.

Merci beaucoup.

7voto

Daniel Earwicker Points 63298

Les sockets de Windows ont le select fonction. Vous lui passez le handle de la socket et une socket à vérifier pour la lisibilité, ainsi qu'un timeout, et elle retourne en indiquant si la socket est devenue lisible ou si le timeout a été atteint.

Voir : http://msdn.microsoft.com/en-us/library/ms740141(VS.85).aspx

Voici comment procéder :

bool readyToReceive(int sock, int interval = 1)
{
    fd_set fds;
    FD_ZERO(&fds);
    FD_SET(sock, &fds);

    timeval tv;
    tv.tv_sec = interval;
    tv.tv_usec = 0;

    return (select(sock + 1, &fds, 0, 0, &tv) == 1);
}

S'il retourne vrai, votre prochain appel à recv devrait revenir immédiatement avec des données.

Vous pourriez rendre cela plus robuste en vérifiant select pour les valeurs de retour d'erreur et de lancer des exceptions dans ces cas. Ici, je renvoie simplement true si ça dit qu'une poignée est prête à être lue, mais ça veut dire que je retourne false dans toutes les autres circonstances, y compris lorsque la prise est déjà fermée.

0voto

Didier Trosset Points 17949

Vous devez appeler le select avant d'appeler la fonction recv pour savoir s'il y a quelque chose à lire.

0voto

Adil Points 685

Vous pouvez utiliser l'option de socket SO_RCVTIMEO pour spécifier la valeur du délai d'attente pour l'appel recv().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X