选择插座和标准
Select on socket and stdin
我正在试验选择,并有一个简单的应用程序,无论用户在命令行中输入什么,都可以写入服务器。然后,服务器将其回显。我正在使用选择功能来侦听连接的套接字和标准。
客户端代码:
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] = ' ';
cout<<"nSocket read!n";
cout<<readArr;
}
}
现在,如果我在命令行中键入"Hello!"并按回车键,我会得到以下输出:
Hello! //User input
Socket write!//Client output
Socket read!//Client output
如果我再次按回车键,则会打印"Hello!"。为什么我需要按两次回车键?
我可以从服务器输出中看到,在第一次输入后,消息被正确发送到服务器,然后返回。
cin>>input
不会从行尾读取换行符,cout<<readArr
也不会写入换行符。 如果使用cout<<readArr<<endl
它将在字符串后写入换行符并刷新输出缓冲区。 如果不希望字符串后使用换行符,则可以使用 flush
而不是 endl
来仅刷新输出缓冲区。 如果您根本不希望cout
缓冲您的输出,也可以将其更改为无缓冲。
你的cin>>input
不会读一整行,只读一个单词。它不会读取换行符,如果您键入两个单词,它不会读取第二个单词。您可能应该改用getline(cin,input)
,它读取整行并放入input
(没有换行,它被丢弃)。
相关文章:
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 标准库类型的赋值运算符的引用限定符
- 标准是否严格定义了该程序应该如何编译?
- 如何从Windows应用程序输出到标准?
- 安全到标准:移动会员?
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- 这是否符合C++标准:双响双响,例如!!(-0.0).
- 标准::变体的赋值运算符
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 如何在 Mac 上使用 c++17 并行标准库算法?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 选择插座和标准