繁体   English   中英

Boost.Asio read_some:文件结尾错误

[英]Boost.Asio read_some: End of file error

此示例基于Boost.Asio C++ Network Programming一书中的第 1 章。 我正在尝试使用 Boost.Asio 库构建一个简单的客户端和同步服务器。

这是客户端代码

#define BOOST_ASIO_SEPARATE_COMPILATION
#include <iostream>
#include <boost/asio/impl/src.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/write.hpp>
#include <string>

int main(int argc, char **argv) {
    boost::asio::io_service ioservice;
    boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"),2001);
    boost::asio::ip::tcp::socket sock(ioservice);
    sock.connect(ep);

    return 0;
}

这是服务器代码。

#define BOOST_ASIO_SEPARATE_COMPILATION

#include <stdio.h>
#include <iostream>
#include <boost/asio/impl/src.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio/write.hpp>

using namespace boost::asio;
typedef boost::shared_ptr<boost::asio::ip::tcp::socket> socket_ptr;
void client_session(socket_ptr sock);

int main(int argc, char **argv) {

    io_service ioservice;

    ip::tcp::endpoint ep(ip::tcp::v4(),2001);
    ip::tcp::acceptor acc(ioservice,ep);

    while(true){
      socket_ptr sock(new ip::tcp::socket(ioservice));
      acc.accept(*sock);
      boost::thread(boost::bind(client_session,sock));
    }

    return 0;
}

void client_session(socket_ptr sock)
{
   std::cout << "Handling client session \n";

    while(true){
      char data[512];
      size_t len = sock->read_some(buffer(data));
      if (len > 0)
    boost::asio::write(*sock,buffer("ok",2));

    }
}

运行服务器后,当我启动客户端时,我在服务器上得到以下输出

Handling client session
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
      what():  read_some: End of file
    Aborted

我不确定这里发生了什么。 请帮忙。

您的服务器希望客户端在连接后发送一些数据,但它没有。 客户端在连接后简单地退出。

客户端的以下修改只是将数据无限循环发送到服务器,服务器总是以“ok”响应。

#define BOOST_ASIO_SEPARATE_COMPILATION
#include <iostream>
#include <boost/asio/impl/src.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/write.hpp>
#include <string>

int main(int argc, char **argv) {
    boost::asio::io_service ioservice;
    boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"),2001);
    boost::asio::ip::tcp::socket sock(ioservice);
    sock.connect(ep);

    for(;;)
    {
      boost::array<char, 512> buf  = {{ 0 }};
      boost::system::error_code ignored_error;
      boost::asio::write(sock, boost::asio::buffer(buf), ignored_error);
      size_t len = sock.read_some(boost::asio::buffer(buf), ignored_error);
      std::cout.write(buf.data(), len);
    }

    return 0;
}

为了避免在客户端断开连接时服务器崩溃,您应该将read_some调用包装在try...catch块中:

void client_session(socket_ptr sock)
{
  std::cout << "Handling client session \n";

  try
  {
    while(true){
      char data[512];
      size_t len = sock->read_some(buffer(data));
      if (len > 0)
      boost::asio::write(*sock,buffer("ok",2));

    }
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }
}

您还应该查看 boost asio 文档中的示例: http : //www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/tutorial.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM