2009-07-09 5 views
3

Pour une prise de blocage TCP, est-il sûr d'appeler:est-il sûr de recv passer en 0 pour détecter une erreur de socket?

if(SOCKET_ERROR != recv(s, NULL, 0, 0)) 
//... 

pour détecter les erreurs? Je pensais que c'était sûr, alors j'ai eu une situation sur un ordinateur qu'il était suspendu à cette déclaration. (était avec une prise ssl si cela compte). J'ai également essayé de passer dans le drapeau MSG_PEEK avec un tampon spécifié mais je me suis aussi bloqué là.

Quelle est l'alternative?

+0

Je suis sous Windows si cela importe. –

Répondre

4

En plus d'autres réponses - voici une petite fonction pratique pour obtenir l'erreur de socket en attente:


/* Retrives pending socket error. */ 
int get_socket_error(int sockfd) 
{ 
    int error; 
    socklen_t len(sizeof(error)); 

    if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) 
     error = errno; 

    return error; 
} 
3

Vous avez bien dit que vous utilisiez un socket bloquant, mais vous devriez utiliser select à la place (même si vous le définissez comme déblocage avant l'appel select). Il vous permet d'interroger un descripteur de fichier et de voir s'il y a des données en attente, ou s'il y a une erreur.

2

L'appel lui-même est "sûr" dans un sens où il devrait fonctionner comme documented, cependant vous devez réaliser que recv est un appel de réception bloquant. Cela signifie que l'appel bloquera le thread en cours d'exécution jusqu'à ce que les données arrivent sur le socket. Cela peut entraîner le blocage de votre application si vous n'utilisez pas un thread différent pour effectuer votre réception ou vérifier si des données sont disponibles avant la réception d'un appel (select).

Questions connexes