boost::asioread/write麻烦
boost::asio read/write trouble
我开始学习 boost::asio 并尝试制作简单的客户端-服务器应用程序。现在我在服务器上遇到了麻烦。这里代码:
int main(int argc, char* argv[])
{
using namespace boost::asio;
io_service service;
ip::tcp::endpoint endp(ip::tcp::v4(), 2001);
ip::tcp::acceptor acc(service, endp);
for (;;)
{
socker_ptr sock(new ip::tcp::socket(service));
acc.accept(*sock);
for (;;)
{
byte data[512];
size_t len = sock->read_some(buffer(data)); // <--- here exception at second iteration
if (len > 0)
write(*sock, buffer("ok", 2));
}
}
}
它正确接受客户端套接字,正确读取,然后写入数据并开始新的迭代。在第二次迭代中抛出异常。看起来像:
我不明白为什么会这样?
我只需要在客户端出现时服务器必须 read/write 连续。当客户端离开时,服务器必须接受下一个客户端。
所以主要问题是:为什么会发生异常以及如何避免?
...
UPDATE1:我发现在第一次迭代时,read/write 操作的错误代码都是成功的。但是(!)在异常重新出现的地方的第二次迭代中,错误代码是 "End of file"。但为什么?
您遇到文件结束条件,因为连接的远程端已关闭或断开连接。
您应该处理系统错误,或者使用引用 boost::system::error_code
的重载。否则你会如何终止无限循环?
#include <boost/asio.hpp>
#include <iostream>
int main()
{
using namespace boost::asio;
io_service service;
ip::tcp::endpoint endp(ip::tcp::v4(), 2001);
ip::tcp::acceptor acc(service, endp);
for (;;)
{
ip::tcp::socket sock(service);
acc.accept(sock);
boost::system::error_code ec;
while (!ec)
{
uint8_t data[512];
size_t len = sock.read_some(buffer(data), ec);
if (len > 0)
{
std::cout << "received " << len << " bytes\n";
write(sock, buffer("ok", 2));
}
}
std::cout << "Closed: " << ec.message() << "\n";
}
}
我开始学习 boost::asio 并尝试制作简单的客户端-服务器应用程序。现在我在服务器上遇到了麻烦。这里代码:
int main(int argc, char* argv[])
{
using namespace boost::asio;
io_service service;
ip::tcp::endpoint endp(ip::tcp::v4(), 2001);
ip::tcp::acceptor acc(service, endp);
for (;;)
{
socker_ptr sock(new ip::tcp::socket(service));
acc.accept(*sock);
for (;;)
{
byte data[512];
size_t len = sock->read_some(buffer(data)); // <--- here exception at second iteration
if (len > 0)
write(*sock, buffer("ok", 2));
}
}
}
它正确接受客户端套接字,正确读取,然后写入数据并开始新的迭代。在第二次迭代中抛出异常。看起来像:
所以主要问题是:为什么会发生异常以及如何避免?
...
UPDATE1:我发现在第一次迭代时,read/write 操作的错误代码都是成功的。但是(!)在异常重新出现的地方的第二次迭代中,错误代码是 "End of file"。但为什么?
您遇到文件结束条件,因为连接的远程端已关闭或断开连接。
您应该处理系统错误,或者使用引用 boost::system::error_code
的重载。否则你会如何终止无限循环?
#include <boost/asio.hpp>
#include <iostream>
int main()
{
using namespace boost::asio;
io_service service;
ip::tcp::endpoint endp(ip::tcp::v4(), 2001);
ip::tcp::acceptor acc(service, endp);
for (;;)
{
ip::tcp::socket sock(service);
acc.accept(sock);
boost::system::error_code ec;
while (!ec)
{
uint8_t data[512];
size_t len = sock.read_some(buffer(data), ec);
if (len > 0)
{
std::cout << "received " << len << " bytes\n";
write(sock, buffer("ok", 2));
}
}
std::cout << "Closed: " << ec.message() << "\n";
}
}