2009-06-09 3 views
6

Tôi đã cố gắng đạt được điều đó cho phần tốt hơn trong ngày, tôi thành thật xin giúp đỡ. Cả hai ứng dụng của tôi, máy khách và máy chủ đều bắt đầu ném "ngoại lệ vector ra khỏi phạm vi" ngoại lệ.Làm cách nào để gửi std :: vector <char> bằng Boost :: Asio?

Làm cách nào để thực hiện điều này đúng cách?


Vẫn đang cố gắng tìm ra điều này, bất kỳ ai?

Theo như tôi đã hiểu tôi dự định tạo ra một

boost::asio::basic_stream_socket stream; Và sau đó gọi:

stream.send(boost::asio::buffer(data));?

Tôi cho rằng hoàn toàn có thể làm điều đó một cách không đồng bộ? Sự khác biệt giữa: basic_stream_socket::send() so với basic_stream_socket::write_some() so với basic_stream_socket::async_write_some() là gì?

basic_stream_socket::receive() so với baic_stream_socket::read_some() so với basic_stream_socket::async_read_some()?

Tôi giả định rằng send() & là các phương thức mà tôi có thể gọi khi tôi muốn đảm bảo rằng 100% dữ liệu được gửi/nhận - với chi phí chặn socket?

Tôi giả định rằng write_some() & read_some() là các phương pháp mà tôi có thể gọi khi tôi không chắc liệu 100% dữ liệu được gửi/nhận - trong khi vẫn chặn ổ cắm?

Tôi giả định rằng async_read_some() & async_write_some() là các phương pháp không chặn ổ cắm và họ đọc/ghi những gì có thể?

+3

bạn có thể hiển thị một số mã không? – Naveen

+0

Bạn nên thêm thông tin thêm vào thân câu hỏi hoặc dưới dạng nhận xét thay vì trả lời câu hỏi của riêng bạn bằng câu hỏi. Nếu bạn cần thiết lập mọi thứ từ đầu, vui lòng cung cấp một số ngữ cảnh (ví dụ: đây là ổ cắm TCP, cổng nối tiếp RS-232, v.v ...). –

+0

Đã xóa q "Không, tôi chưa làm - làm cách nào để làm điều đó?" - không chắc chắn những gì áp dụng cho, nhưng nó là tốt hơn để cập nhật các câu hỏi (hoặc để lại ý kiến ​​khi bạn nhận được đủ đại diện). –

Trả lời

5

Giả sử bạn đã tạo một dòng và đang cố gắng để gửi vector<char>dữ liệu:

stream.send(boost::asio::buffer(data)); 

Xem boost:asio::buffer.

0

Tôi khá mới để thúc đẩy ASIO quá nhưng đây là câu trả lời của tôi:

Các chức năng với tên hàm bắt đầu với async_ mất, giữa những người khác, một hàm callback như là đối số đó sẽ được gọi khi hoạt động kết thúc. Nghĩa là hàm async_write_some() không chặn nhưng trả về ngay lập tức và khi thao tác kết thúc, hàm gọi lại được gọi.

Giả định của bạn là chính xác, theo như tôi đã hiểu. Tuy nhiên, với các hàm async_write_some, v.v. bạn có một hàm gọi lại, lấy số byte được chuyển làm đối số.

Ví dụ, ở đây tôi có một chức năng mà đọc từ một ổ cắm:

boost::asio::async_read(
    *socket_, 
    boost::asio::buffer(read_msg_.body(), read_msg_.body_length()), 
    boost::bind(
     &sender::handle_read_content, 
     this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred 
    ) 
); 

Các hàm callback trong đó là handle_read_content, và nó trông như thế này:

void sender::handle_read_content(
    const boost::system::error_code& err, 
    std::size_t bytes_transferred 
) 

Trong đầu tôi đọc hướng dẫn này rất tốt: Boost Asio