OVH Cloud OVH Cloud

socket, select, timeout

3 réponses
Avatar
fabrizio
Bonjour,

Programme en C, compilé avec gcc. J'ai un comportement que je ne
parviens pas à expliquer avec l'appel select(..). Voilà en gros
l'algorithme :
//un descripteur "sock", créé avec socket(PF_INET, SOCK_DGRAM, ..)
//un jeu de descripteurs "set" qui ne contient que sock
while(condition) {
attente.tv_sec = 0;
attente.tv_usec = 100000;
int ret = select(sock+1, set, NULL, NULL, &attente);
if (ret < 0) perror(select);
if (ret == 0) {
printf("timeout\n");
continue;
}
printf("données dispo\n");
recv(sock, buffer, ..);
//utilisation des données
}

Cela fonctionne à merveille, sauf dans le scénario suivant :
1 - Démarrage émetteur
2 - Démarrage récepteur
données dispo
...
3 - Arrêt émetteur
timeout
...
4 - Démarrage émetteur
timeout
...

Tcpdump m'indique que les packets arrivent effectivement (sur le bon
port), mais select(..) continue à retourner un timeout.

Ce comportement est-il normal ?
Le cas échéant, quelle boulette ai-je pu faire ?

Toute idée est la bienvenue,
Fabrice

3 réponses

Avatar
fabrizio
02/04/2008 12:28 - fabrizio :
Bonjour,

Programme en C, compilé avec gcc. J'ai un comportement que je ne
parviens pas à expliquer avec l'appel select(..). Voilà en gros
l'algorithme :
//un descripteur "sock", créé avec socket(PF_INET, SOCK_DGRAM, ..)
//un jeu de descripteurs "set" qui ne contient que sock
while(condition) {
attente.tv_sec = 0;
attente.tv_usec = 100000;
int ret = select(sock+1, set, NULL, NULL, &attente);
if (ret < 0) perror(select);
if (ret == 0) {
printf("timeoutn");
continue;
}
printf("données dispon");
recv(sock, buffer, ..);
//utilisation des données
}

Cela fonctionne à merveille, sauf dans le scénario suivant :
1 - Démarrage émetteur
2 - Démarrage récepteur
données dispo
...
3 - Arrêt émetteur
timeout
...
4 - Démarrage émetteur
timeout
...

Tcpdump m'indique que les packets arrivent effectivement (sur le bon
port), mais select(..) continue à retourner un timeout.

Ce comportement est-il normal ?
Le cas échéant, quelle boulette ai-je pu faire ?

Toute idée est la bienvenue,
Fabrice


J'oubliai de préciser que le programme est multithread et compilé contre
la bibliothèque pthread (NPTL) et que tout ceci tourne sur un noyau
2.6.22.1-rt9.

Avatar
fabrizio
Je continue à me répondre à moi-même.

Timeout donc fd_set vide. Donc moi pas savoir bien lire.

Je me remercie bien.
Avatar
Cyrille Lefevre
Je continue à me répondre à moi-même.

Timeout donc fd_set vide. Donc moi pas savoir bien lire.

Je me remercie bien.


Hi, Bonjour,

de rien :)

Regards, Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
remove "%nospam" and ".invalid" to answer me.