2017-05-23 68 views
-2

我有通過TCP套接字連接到服務器,下面一個客戶端程序:讀/打印插座輸出中(W/O多線程)

int main () 
{ 
    std::cout << "HunterChat client starting up" << std::endl; 
    std::string cmd; 
    std::string reply; 
    bool cont = true; 
    ClientSocket client_socket ("localhost", PORT); 
    try { 
     while(cont) { 
       try { 
        std::cout << ">> "; 
        // std::getline(std::cin,cmd); 
        gets(cmd); 
        if(cmd.compare("logout") == 0) { 
         cont = false; 
         break; 
        } 
        client_socket << cmd; 
        client_socket >> reply; 
        std::cout << reply << std::endl; 
       } 
       catch (SocketException& e) { 
        std::cout << "Exception was caught:" << e.description() << "\n"; 
       } 
     } 
    } 
    catch (SocketException& e) { 
     std::cout << "Exception was caught:" << e.description() << "\n"; 
    } 

    return 0; 
} 

ClientSocket的是一個自定義類,讓我建立並使用TCP連接;流運營商有過多的,下面的代碼:

int status = ::send (m_sock, s.c_str(), s.size(), MSG_NOSIGNAL); 
if (status == -1) 
{ 
    return false; 
} 
else 
{ 
    return true; 
} 

的TCP連接本身工作正常,所以我不會有更多的它弄亂張貼。問題在於其中一個可用命令涉及在客戶端仍在等待cin輸入時向客戶端實例發送輸入。這意味着當我在cin中鍵入內容時,服務器消息只能被讀取和寫入。我試圖避免使用多線程,所以有沒有辦法讓cin在沒有它的情況下被中斷?

+0

解決此類問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,你應該[編輯]你的問題,以包含一個[Minimal,Complete,and Verifiable](http://stackoverflow.com/help/mcve)例子來重現你的問題,以及你在調試器中所做的觀察。 –

回答

0

那麼,你可以使用循環和功能kbhit()檢查用戶輸入,如果你真的想。但是,線程似乎是一個更好的解決方案。

#include <conio.h> 
#include <iostream> 

using namespace std; 



int main() 
{ 
    while(1) 
    { 
     if(kbhit()) 
     { 
      char x = getch(); 
      // ... 
     } 
     // check messages asynchronously here 
    } 
}