0

我正在试验 select 并有一个简单的应用程序,无论用户在命令行中输入什么,它都可以写入服务器。然后服务器将其回显。我正在使用 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;
  }
}

现在,如果我输入“你好!” 在命令行中按回车,我得到这个输出:

Hello! //User input

Socket write!//Client output

Socket read!//Client output

如果我再次按 Enter 键,“你好!” 被打印。为什么我需要按两次回车?

我可以从服务器输出中看到,第一次输入后,消息被正确发送到服务器,然后返回。

4

2 回答 2

1

cin>>input不从行尾读取换行符,cout<<readArr也不写入换行符。如果使用cout<<readArr<<endl它将在字符串后写一个换行符并刷新输出缓冲区。如果你不想在你的字符串后面换行,你可以使用flush而不是endl只刷新输出缓冲区。cout如果您根本不希望它缓冲您的输出,您也可以更改为无缓冲。

于 2012-11-29T00:19:00.763 回答
0

cin>>input没有读一整行,只有一个字。它不会读取换行符,如果您键入两个单词,它将不会读取第二个单词。您可能应该getline(cin,input)改用它,它读取整行并放入input(没有换行,它被丢弃)。

于 2012-11-29T02:15:26.693 回答