2012-03-05 4 views
0

Je suis actuellement en train de tenter de créer une application serveur et client qui utilise winsock, avec un programme principal, j'ai besoin d'un deuxième thread pour toujours écouter les données.C++ Implémentation de threads avec communication inter-thread

Cette communication est non bloquante. J'ai vraiment du mal à trouver un moyen de communiquer entre les threads, un exemple de ce que je cherche est: Serveur envoie une chaîne au client, par exemple. "viewData" et ce type d'informations seront récupérées par le thread principal, puis une fonction spécifique peut également être appelée.

Voici un exemple de mon fils, je crée cela en utilisant _beginthread((void(*)(void*))SocketReceive, 0, (void*)&ohuman);

//thread focused on listening to connection 
void SocketReceive(comms* ohuman) 
{ 
    char buffer[1000]; 
    int inDataLength; 
    std::string contents; 

    for(;;) 
    { 
     if(!ohuman->getGameOn()) 
     { 
      // Display message from server 
      memset(buffer,0,999); 
      inDataLength=recv((INT_PTR)ohuman->getSocket(),buffer,1000,0); 
      contents = std::string(buffer); //create a string from the char array for easy access 
      //only display if we get some content 

      if(inDataLength > 0) 
      { 
       //???DealWithMessage(

      int nError=WSAGetLastError(); 

      if(nError!=WSAEWOULDBLOCK&&nError!=0) 
      { 
       std::cout<<"Winsock error code: "<<nError<<"\r\n"; 
       std::cout<<"Server disconnected!\r\n"; 
       // Shutdown our socket 
       shutdown((INT_PTR)ohuman->getSocket(),0x01); 
       // Close our socket entirely 
       closesocket((INT_PTR)ohuman->getSocket()); 
       break; 
      } 
     } 
    } 
    _endthread(); 

} 

J'ai vu aussi ce site qui est censé aider avec le CCI, des conseils sur la this-> http://derkarl.org/itc/

Avec une boucle principale simple, je suis intéressé par toute approche qui pourrait fonctionner, j'ai essayé de comprendre cela pendant quelques jours sans succès, toute aide est grandement appréciée.

+0

Si vous allez avoir la peine d'élever un thread supplémentaire pour vous connecter au serveur et écouter les données de recv, pourquoi utilisez-vous un design non bloquant? Ce qui précède pour (;;) semble utiliser un noyau qui ne fait rien. –

Répondre

0

Vous pouvez avoir une variable partagée (avec des verrous) et les deux threads interroger/écrire, ou vous pouvez enregistrer callback functions entre les threads et appeler l'autre thread sur un événement.

Questions connexes