【发布时间】:2018-07-26 02:47:13
【问题描述】:
假设客户端使用 TCP 向服务器发送数据,使用 boost::asio,在“同步模式”(也称为“阻塞”功能)。
客户端代码(略过查询和io_service部分):
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::socket socket( io_service );
boost::asio::connect( socket, endpoint_iterator );
std::array<char, 1000> buf = { /* some data */ };
size_t n = socket.send( boost::asio::buffer(buf) );
这会将整个缓冲区(1000 字节)发送到连接的机器。
现在是服务器代码:
tcp::acceptor acceptor( io_service, tcp::endpoint( tcp::v4(), port ) );
tcp::socket socket( io_service );
boost::system::error_code err;
std::array<char, 500> buff;
size_t n = socket.read_some( boost::asio::buffer(buff), err );
std::cout << "err=" << err.message() << '\n';
- 这是做什么的:客户端通过连接发送 1000 字节,服务器尝试将其存储在 500 字节缓冲区中。
- 我所期望的:服务器错误状态表明缓冲区太小和/或接收到的数据过多。
- 我得到的结果:“成功”错误值,并且服务器中的 n=1000。
我在这里错过了什么? ASIO 不能检测缓冲区溢出吗? 我应该继续使用其他一些类/函数(可能是流吗?)
Refs(对于 1.54,这是我使用的):
【问题讨论】:
标签: c++ networking boost boost-asio