2011-11-04 11 views
6

Vì vậy, đây là vấn đề của tôi: chúng tôi đã có accepted một ổ cắm asc tcp tăng. Và tất cả các API của chúng tôi đều sử dụng nó. Và chúng ta chỉ cần thực hiện 'đọc hết thời gian' như vậy trong một hàm.Tăng cường asio: Có thể bật socket tcp được chấp nhận thành basic_socket_iostream (hoặc bằng cách nào đó lấy nó từ nó)?

Có thể thực hiện 'đọc hết thời gian' như được hiển thị here. Nhưng tôi nhận được tăng asc tcp socket từ API của tôi vì vậy tôi tự hỏi nếu nó là bất kỳ cách nào có thể để biến Boost :: asio socket thành basic_socket_iostream. Làm thế nào để làm nó?

+0

Không phải là giải pháp cho câu hỏi của bạn, mà là một giải pháp thay thế: http://think-async.com/Asio/boost_asio_1_10_6/doc/html/boost_asio/example/cpp03/iostreams/daytime_server.cpp –

Trả lời

4

Tôi tự hỏi liệu có thể bật Boost :: asio socket thành basic_socket_iostream không. Làm thế nào để làm nó?

bạn có thể sử dụng tcp::iostream::rdbuf() để có được một con trỏ đến socket::basic_socket_streambuf sau đó assign() mô tả.

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

Mặc dù đây là rất phức tạp và tôi mạnh mẽ đề nghị không đi tuyến đường này. Vì số Ralf's answer được chỉ định và my answer đối với câu hỏi được liên kết của bạn được đề xuất, bạn thực sự nên sử dụng một số deadline_timer cho việc này.

+0

Hardwiring tcp :: v4() không đẹp như vậy. Thay vào đó chúng ta có thể sử dụng một cái gì đó như: _stream.rdbuf() -> gán (socket.local_endpoint(). Protocol(), socket.native_handle()); –

+0

Phương thức gán() đang bị treo trên Windows đối với tôi. Điều này thực sự phải làm việc? –

+0

Dường như không hoạt động với tôi trên Windows ... :-( –

2

Bạn không nêu rõ liệu có là một yêu cầu không sử dụng các API không đồng bộ nên có lẽ đây sẽ giúp bạn và có lẽ không:

Trừ khi tôi là sự hiểu lầm bạn, tôi nghĩ rằng câu trả lời SO tài liệu tham khảo bạn đang xem xét một trường hợp sử dụng khác có nghĩa là thời gian chờ bằng tcp :: iostream. Nếu bạn chỉ muốn thêm thời gian chờ để đọc, bạn đã xem số timeout examples in the asio documentation chưa? Đây là cách tiếp cận tiêu chuẩn để hết thời gian hoạt động của socket.

1

Đối với bất kỳ ai khác sẽ đi qua vấn đề này, sau khi cố gắng để làm việc này trong nhiều giờ tôi quyết định viết một lớp wrapper đơn giản sử dụng Boost "Thiết bị": Ví dụ 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; 

}; 

sử dụng:

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

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