Bonjour,

Tout d'abord, j'espère poster au bon endroit... En tout voici mon problème:

Une tâche maître (M) doit initier une communication avec d'autres tâches esclaves (E), situées sur d'autres ordinateurs (polling). Mais je ne sais pas si les programmes E tournent (peut-être que l'un des ordinateurs est même éteint!). Comme la taille des données est parfois importante ( > 1KB), je préfère utiliser TCP qu'UDP. Mais il ne faut pas qu'une connection défaillante bloque le polling! Donc j'ai choisi de travailler avec une connexion non-blocking TCP.

La séquence que je fais pour l'init de connexion est la suivante:
1) Création socket
2) Flag non bloquant
3) Connect
4) Si connexion OK, envoi du message (sur la même machine c'est très rapide)
5) Sinon démarrage tempo (gettimeofday())

Puis, au second passage je fais:
1) Test connexion (select() sur socket en read et write sans tempo)
2) Si écriture possible, connexion OK!
3) Sinon vérif tempo et éventuellement abandon

Et ce qui ne fonctionne pas, c'est le test de connexion:
Si le programme E ne tourne pas (celui qui reçoit la demande de connexion), j'ai quand même un retour positif (connexion OK)!

Le code du test:
Les fonctions w_* sont des wrappers pour récupérer automatiquement les erreurs système.
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
 
// test connection in progress
do
{
    retValue = w_select(daemonFd + 1, &readSet, &writeSet, 0, &timeStruct);
} while (retValue == -1 && errno == EINTR);
if (retValue == -1)
{
    return;
}
// if connection is finally OK!
if (FD_ISSET(daemonFd, &writeSet) != 0 && FD_ISSET(daemonFd, &readSet) == 0)
{
    pMsgStruct = pMsg->getMsg(SERVER_REQUEST);
    if (w_write(daemonFd, pMsgStruct->pFullString, pMsgStruct->size) != -1)
    {
        pMsg->remMsg(SERVER_REQUEST);
        connectTimeStruct.tv_sec = 0;
        connectTimeStruct.tv_usec = 0;
    }
    return;
}
Ma question est:
Comment puis-je tester que la connexion est bonne (dans mon code, c'est le if (FD_ISSET(...)) )? Merci d'avance pour vos réponses.