Vous pouvez utiliser la fonction setsockopt pour définir un délai d'attente lors de la réception des opérations:
SO_RCVTIMEO
Définit la valeur de délai d'attente qui spécifie le montant maximum de temps une fonction entrée attend jusqu'à ce qu'il complète. Il accepte une structure timeval avec le nombre de secondes et microsecondes spécifiant la limite sur combien de temps à attendre une opération d'entrée à terminée. Si une opération de réception a bloqué pour tout ce temps sans recevoir des données supplémentaires, il doit retour avec un décompte partiel ou errno réglé sur [EAGAIN] ou [EWOULDBLOCK] si aucune donnée est reçue. La valeur par défaut pour cette option est zéro, ce qui indique qu'une opération de réception ne doit pas expirer. Cette option prend une structure timeval. Notez que toutes les implémentations ne permettent pas de définir cette option.
// LINUX
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
// WINDOWS
DWORD timeout = timeout_in_seconds * 1000;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
// MAC OS X (identical to Linux)
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
Reportedly sous Windows, il devrait être fait avant d'appeler bind
. J'ai vérifié par l'expérience que cela peut être fait avant ou après bind
sous Linux et OS X.
Il y a aussi une possibilité d'utiliser des fils :) mais les signaux de fil toujours nécessaire – osgx