2011-11-04 6 views
6

Więc oto mój problem: już mamy accepted doładowanie gniazda asio tcp. I wszystkie nasze interfejsy API go używają. Musimy po prostu wykonać taki "odczyt z przekroczeniem limitu czasu" w jednej funkcji.Zwiększanie asio: Czy możliwe jest przekierowanie zaakceptowanego gniazda tcp do basic_socket_iostream (lub jakoś je z niego pobrać)?

Możliwe jest wykonanie takiego "odczytu z przekroczeniem limitu czasu", jak pokazano here. Ale dostaję doładowanie asio tcp gniazda z moich API, więc zastanawiam się, czy to było jak to możliwe, aby włączyć Boost :: Asio gniazdo do basic_socket_iostream. Jak to zrobić?

+0

nie jest rozwiązaniem na Twoje pytanie, ale alternatywą: http://think-async.com/Asio/boost_asio_1_10_6/doc/html/boost_asio/example/cpp03/iostreams/daytime_server.cpp –

Odpowiedz

4

Zastanawiam się, czy to możliwe, aby jakikolwiek sposób włączyć boost :: asio gniazdo do basic_socket_iostream. Jak to zrobić?

można użyć tcp::iostream::rdbuf() aby uzyskać wskaźnik do socket::basic_socket_streambuf następnie assign() deskryptora.

#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()); 
} 

Choć jest bardzo zawiłe i zdecydowanie nie proponuję jechać tą trasą. Jak wskazano Ralf's answer i my answer dla sugerowanego przez ciebie linku, naprawdę powinieneś używać do tego celu deadline_timer.

+0

oprzewodowanie tcp :: v4() nie jest taki miły. Zamiast tego możemy użyć czegoś takiego: _stream.rdbuf() -> assign (socket.local_endpoint(). Protocol(), socket.native_handle()); –

+0

Metoda assign() dla mnie ulega awarii w systemie Windows. Czy to naprawdę ma działać? –

+0

Wydaje się, że nie działa dla mnie ani na Windows ... :-( –

2

Nie stwierdzić, czy istnieje wymóg, aby nie używać asynchronicznego API więc może to pomaga, a może nie:

Chyba jestem nieporozumienie was, myślę, że SO odpowiedzieć odwołać patrzy inny przypadek użycia, np. limit czasu przy użyciu tcp :: iostream. Jeśli chcesz po prostu dodać limit czasu do czytania, czy spojrzałeś na timeout examples in the asio documentation? Jest to standardowe podejście do przekroczenia limitu czasu operacji gniazda.

1

Dla każdego, kto będzie natknąć się ten problem, po próbuje dostać tej pracy na wiele godzin postanowiłem napisać prosty klasy otoki użyciu Boost „Devices”: przykład 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; 

}; 

Zastosowanie:

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

for (;;) { 
    std::getline(in, line); 
    if (line.length() > 0) 
     std::cout << line << std::endl; 
    else 
     break; 
} 
Powiązane problemy