2012-03-05 51 views
0

我目前正在嘗試創建使用winsock的服務器和客戶端應用程序,並且我需要第二個線程來監聽數據。C++使用線程間通信實現線程

此通信是非阻塞的。我在尋找線程之間的通信方式時遇到了困難,我想要尋找的一個例子是:服務器向客戶端發送一個字符串,例如「viewData」並且這種信息將被主線程獲取,然後還可以調用一個特定的函數。

這裏是我的線程的一個例子,我在這 - > http://derkarl.org/itc/

創建這個使用 _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(); 

} 

我也看到了這個網站這是爲了幫助與ITC,任何建議

隨着一個簡單的主循環,我感興趣的任何方法可能工作,我一直在試圖找出這幾天沒有運氣,任何幫助,非常感謝。

+0

如果您打算提出一個額外的線程來連接服務器並偵聽recv數據,您爲什麼要使用非阻塞設計?上面的(;;)看起來像是用了一個無所事事的核心。 – 2012-03-05 18:26:52

回答

0

您可以擁有一個共享變量(鎖定它)並且兩個線程都對其進行輪詢/寫入,或者您可以在線程之間註冊callback functions並在某個事件中調用另一個線程。