2011-11-04 12 views
6

İşte benim sorunum: zaten accepted bir boost asio tcp soketimiz var. Ve tüm API'larımız bunu kullanıyor. Ve biz sadece tek bir fonksiyonda 'zamanlanmış okuma' yapmak zorundayız.Yükseltme asus: kabul edilen tcp soketini basic_socket_iostream içine döndürmek mümkün mü (veya bir şekilde ondan elde edebilirsiniz)?

here'da gösterildiği gibi 'zaman aşımlı okuma' yapmak mümkündür. Ancak API'lerimden asio tcp soketini güçlendiriyorum, bu yüzden Boost :: asio yuvasını basic_socket_iostream'a dönüştürmenin ne kadar mümkün olduğunu merak ediyorum. Nasıl yapılır?

+0

değil sorunuza çözüm, ancak alternatif: http://think-async.com/Asio/boost_asio_1_10_6/doc/html/boost_asio/example/cpp03/iostreams/daytime_server.cpp –

cevap

4

acaba o olsaydı basic_socket_iostream içine Boost :: asio soket nasıl açacağınızı mümkün olan her. Nasıl yapılır?

Eğer socket::basic_socket_streambuf sonra assign() açıklayıcı bir işaretçi almak için tcp::iostream::rdbuf() kullanabilirsiniz. Bu olsa

#include <boost/asio.hpp> 

int 
main() 
{ 
    boost::asio::io_service io_service; 
    boost::asio::ip::tcp::socket socket(io_service); 
    boost::asio::ip::tcp::iostream stream; 
    stream.rdbuf()->assign(boost::asio::ip::tcp::v4(), socket.native_handle()); 
} 

çok dolambaçlı ve şiddetle bu rotayı gitmiyor öneririz. İlgili soru için Ralf's answer ve my answer belirtildiği gibi, bunun için gerçekten bir deadline_timer kullanıyor olmalısınız. saatlerce bu çalışma almak için denedikten sonra bu problem karşısında gelecek herkesten için

+0

Kablolama tcp :: v4() çok hoş değil. Bunun yerine aşağıdaki gibi bir şey kullanabiliriz: _stream.rdbuf() -> atama (socket.local_endpoint(). Protocol(), socket.native_handle()); –

+0

Yöntem atama, Windows benim için çöküyor. Bunun gerçekten çalışması gerekiyor mu? –

+0

Windows için de çalışmıyor gibi görünüyor ... :-( –

2

Sen belki bu yardımcı olur ve belki de bu yüzden asenkron API'leri kullanmak bir gereklilik olup olmadığını devlet yoktur:

seni yanlış anlama ediyorum sürece, SO baktığınız referansta cevap düşünüyorum tcp :: iostream kullanarak farklı bir kullanım durumu, yani zaman aşımı. Bir okumaya zaman aşımı eklemek isterseniz, timeout examples in the asio documentation'a baktınız mı? Bu bir soket işleminin zaman aşımı için standart bir yaklaşımdır.

1

Ben Boost "Cihazlar" kullanarak basit bir sarmalayıcı sınıf yazmaya karar: http://www.boost.org/doc/libs/1_64_0/libs/iostreams/doc/tutorial/container_source.html

#include <iostream> 
#include <boost/smart_ptr.hpp> 
#include <boost/asio.hpp> 
#include <boost/iostreams/stream.hpp> 
#include <boost/iostreams/concepts.hpp> 

using boost::asio::ip::tcp; 

typedef boost::shared_ptr<tcp::socket> socket_ptr; 

class my_source : public boost::iostreams::source 
{ 
public: 
    my_source(socket_ptr sock) : _sock(sock) 
    { 

    } 

    std::streamsize read(char* s, std::streamsize n) 
    { 
     return _sock->read_some(boost::asio::buffer(s, n)); 
    } 

private: 
    socket_ptr _sock; 

}; 

kullanım örneği:

boost::iostreams::stream<my_source> in(sock); 

for (;;) { 
    std::getline(in, line); 
    if (line.length() > 0) 
     std::cout << line << std::endl; 
    else 
     break; 
} 
İlgili konular