2012-07-12 216 views
2

我的问题是什么是当你不知道消息大小读取升压tcp套接字的最佳方式?这是一个示例。我只是把一个大小为10 代码是不同的标题,但我不觉得有必要将其列入所有boost asio读取缓冲区

///////////// HPP

typedef boost::asio::ip::tcp::resolver TResolver; 
typedef boost::asio::ip::tcp::resolver::query TResolverQuery; 
typedef boost::asio::ip::tcp::endpoint Tendpoint; 
typedef boost::asio::ip::tcp::socket Tsocket; 
typedef boost::asio::ip::tcp::acceptor Tacceptor; 
#define Tsize 10 

//////////// CPP

while(true) 
{ 
    cout<<"recieve"<<endl; 
    boost::shared_ptr<Tacceptor> acceptor(new boost::asio::ip::tcp::acceptor(*m_io_service)); 
    boost::system::error_code ec; 
    TResolverQuery query(this->getHost(), boost::lexical_cast<std::string>(this->getPort())); 
    TResolver resolver(*m_io_service); 
    Tendpoint endpoint = *resolver.resolve(query); 
    acceptor->open(endpoint.protocol()); 
    acceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(true)); 
    acceptor->bind(endpoint); 
    acceptor->listen(); 
    boost::shared_ptr<Tsocket> socknew(new Tsocket(*m_io_service)); 
    acceptor->accept(*socknew,endpoint); 
    boost::array<char, Tsize> buf; 
    boost::asio::read(*socknew,boost::asio::buffer(buf), ec); 
    cout.write(buf.data(),Tsize);cout << std::endl; 
    socknew->shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec); 
    cout<<"threadId "<< boost::this_thread::get_id()<<endl;   
} 

回答

2

两种最常用的方法是使用任一包含消息的长度,或具有消息结束的标记的协议。

+0

我想如果我让发件人关闭,但只是有一个大的缓冲区,那么它可能会工作,但我会看read_untill – gda2004 2012-07-12 13:21:05

0

我找到了我的问题的解决方案,即我可以使用一段时间而不是eof来读取一个可以工作的向量上的套接字和push_back。我可以在这里创建一个wiki作为参考点。