0

私はselectを試していて、ユーザーがコマンドラインに入力したものをサーバーに書き込む単純なアプリを持っています。その後、サーバーはそれをエコー バックします。選択機能を使用して、接続されたソケットと標準入力をリッスンしています。

クライアントコード:

const int BUFFER_SIZE = 1024;
char *readArr = new char[BUFFER_SIZE];
fd_set rset;
ssize_t n;
string input;
FD_ZERO(&rset);
while(true){
  FD_SET(socketFD[0], &rset);
  FD_SET(0, &rset);

  maxfpd1 = max(socketFD[0], 0) + 1;
  select(maxfpd1, &rset, NULL, NULL, NULL);
  if(FD_ISSET(0, &rset)){
    cin>>input;
    write(socketFD[0], input.c_str(), input.size());
    cout<<"\nSocket write!\n";
  }
  if(FD_ISSET(socketFD[0], &rset)){
    n = read(socketFD[0], readArr, BUFFER_SIZE-1);
    readArr[n] = '\0';
    cout<<"\nSocket read!\n";
    cout<<readArr;
  }
}

さて、「こんにちは!」と入力すると コマンドラインでEnterキーを押すと、次の出力が得られます。

Hello! //User input

Socket write!//Client output

Socket read!//Client output

もう一度Enterキーを押すと、「こんにちは!」印刷されます。Enter キーを 2 回押す必要があるのはなぜですか?

サーバー出力から、最初の入力後にメッセージがサーバーに正しく送信され、その後戻ってくることがわかります。

4

2 に答える 2

1

cin>>input行末から改行を読み取らず、改行をcout<<readArr書き込みません。使用cout<<readArr<<endlすると、文字列の後に改行が書き込まれ、出力バッファーがフラッシュされます。文字列の後に改行が必要ない場合は、出力バッファーをフラッシュするだけでflushなく、代わりに使用できます。出力をまったくバッファしたくない場合は、バッファなしにendl変更することもできます。cout

于 2012-11-29T00:19:00.763 に答える
0

cin>>input全体を読むのではなく、1 単語だけを読みます。改行は読み取れず、2 つの単語を入力しても 2 番目の単語は読み取れません。getline(cin,input)代わりに、行全体を読み取って挿入するinput(改行なしで破棄される) を使用する必要があります。

于 2012-11-29T02:15:26.693 に答える