我正在试验 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 键,“你好!” 被打印。为什么我需要按两次回车?
我可以从服务器输出中看到,第一次输入后,消息被正确发送到服务器,然后返回。