私は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 回押す必要があるのはなぜですか?
サーバー出力から、最初の入力後にメッセージがサーバーに正しく送信され、その後戻ってくることがわかります。