2017-05-23 9 views
-2

私はTCPソケットを介してサーバに接続するクライアントプログラムを持って、以下:読み取り/印刷ソケットouputをCINに待っている間(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接続自体は正常に動作しているので、私はそれをより多くしてポストを乱雑ではないでしょう。問題は、使用可能なコマンドの1つが、クライアントがまだ入力を待っている間にクライアントインスタンスに入力を送信することです。つまり、私が何かをcinに入力すると、サーバのメッセージは読み書きしかできません。私はマルチスレッドの使用を避けようとしているので、それがなくてもcinが中断することを許す方法はありますか?

+0

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。少なくとも、問題を再現する[最小、完全、および検証可能](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 
    } 
} 
関連する問題