2013-03-06 7 views
0

J'envoie un tableau de flottants, un par un, sur un socket TCP. Mon serveur (récepteur - qui gère plusieurs demandes simultanément) programme devrait lire les données jusqu'à la réception de la valeur 0. Si le client (expéditeur) n'envoie rien pendant 10 secondes après qu'il s'est connecté (ou après la dernière valeur envoyée) je veux le serveur pour fermer cette connexion. J'ai trouvé cette approche de signal mais je pense que ce ne sera pas optimal à utiliser dans les threads, mais plus probablement pour fork() car cela me force à utiliser des variables globales. Je dois envoyer le "socket" param à la fonction, donc je peux le fermer et AFAIK ce n'est pas possible.Signal C (alternative?) Pour multi-threading

void time_out(int semnal) { 
    printf("Time out.\n"); 
    close(socket); 
    exit(1); 
} 

et chaque fois qu'un client est connecté, ou envoie quelque chose, j'appelle cela:

signal(SIGALRM, time_out); 
alarm(10); 

Quelles autres options dois-je compter 10 secondes et être en mesure de redémarrer cette minuterie?

+1

Si vous utilisez un type de multiplexage d'E/S (par exemple 'epoll'), il y a de fortes chances qu'il existe déjà un mécanisme de temporisation natif (par exemple' timerfd' sous Linux, ou 'select' avec timeout, etc.) –

+0

pouvez-vous s'il vous plaît être un peu plus précis, un lien ou un petit exemple sur comment fonctionne timerfd (j'ai trouvé la page man linux, mais cet exemple n'est pas tout à fait direct) – NiCU

+1

Le manuel de 'timerfd' c'est assez clair, je trouve. Vous créez un descripteur de fichier qui devient prêt à lire lorsque l'intervalle de temps est écoulé. Mettez ce descripteur de fichier dans votre ensemble surveillé, et vous avez un moyen pratique de savoir quand le temporisateur a tiré. –

Répondre

2

Vous pouvez utiliser select avec un FD vide et un timeout. C'est assez commun et très portable.

+0

merci, j'ai essayé de trouver une meilleure solution mais c'était la plus appropriée – NiCU