2017-09-06 4 views
-1

J'utilise une boucle infinie pour recevoir des données du serveur TCP Je dois effectuer d'autres tâches en boucle simultanément ayant une priorité plus élevée Mais le contrôle reste à recv() fonction chaque fois qu'il attend Données TCP. Comment puis-je effectuer l'opération ci-dessus sans attendre que TCP reçoive des données?La fonction TCP recv() ne fonctionne pas en boucle

while(1) 
{ 
     rdlen = read(fd1, buf, (sizeof(buf) - 1)); 
     if (rdlen > 0) 
     { 
      buf[rdlen] = 0; 
      printf("%s",buf); 
      memset(buf, 0, strlen(buf)); 
     } 
     if((numbytes=recv(sockfd, buf1, wGetLen, 0)) != -1) 
     { 
      printf("%s %d\n", buf1, numbytes); 
      memset(buf1, 0, strlen(buf1));         
     } 
} 

+1

https://stackoverflow.com/questions/15108122/recv -with-non-blocking-socket –

+3

Mettez le socket en mode non-bloquant, et/ou utilisez 'select()', 'poll()', ou similaire pour déterminer s'il y a des données disponibles avant d'essayer de lire depuis le prise. –

+2

Programmation cargo-culte: 'memset (buf1, 0, strlen (buf1));' C'est un non-sens dangereux, IMHO – wildplasser

Répondre

2

Vous devez configurer le socket en tant que socket non bloquant. Ce faisant, si vous appelez recv et qu'il n'y a rien à recevoir, l'appel de fonction renverra -1 pour indiquer une erreur avec EAGAIN comme code d'erreur.

Vous pouvez définir le drapeau non-bloquant comme suit

int fdflag; 
if ((fdflag = fcntl(sockfd, F_GETFL)) == -1) { 
    perror("Error getting socket descriptor flags"); 
    exit(1); 
} 
fdflag |= O_NONBLOCK; 
if (fcntl(sockfd, F_SETFL, fdflag) == -1) { 
    perror("Error setting non-blocking option"); 
    exit(1); 
} 

Ensuite, vous pouvez changer votre appel recv comme suit:

 if((numbytes=recv(sockfd, buf1, wGetLen, 0)) != -1) 
    { 
     printf("%s %d\n",buf1,numbytes); 
     memset(buf1, 0, sizeof(buf1));         
    } 
    else if (errno == EAGAIN) 
    { 
     printf("no data to receive\n"); 
    } 
    else 
    { 
     perror("error on recv"); 
    }  
+0

Oui en utilisant ci-dessus capable de faire d'autres opérations simultanément mais si les données sont disponibles pour recevoir. "Buf1" est vide. – Sanket