2011-08-17 16 views
9

Gần đây tôi đã bắt đầu làm việc với Boost Asio. Tôi nhận thấy rằng receive method of a TCP socket chấp nhận một tham số message_flags. Tuy nhiên, tài liệu tôi tìm thấy cho message_flags chỉ nói rằng nó là một số nguyên mà không chỉ định các giá trị hợp lệ. Các giá trị có thể được gán cho một message_flags là gì và chúng có ý nghĩa gì?Tăng thông điệp Asio_flags

Trả lời

11

Tôi đã tìm kiếm một lúc và cuối cùng đã cố tìm trong mã nguồn của Boost. Tôi thấy điều này trong socket_base.hpp:

/// Bitmask type for flags that can be passed to send and receive operations. 
    typedef int message_flags; 

#if defined(GENERATING_DOCUMENTATION) 
    /// Peek at incoming data without removing it from the input queue. 
    static const int message_peek = implementation_defined; 

    /// Process out-of-band data. 
    static const int message_out_of_band = implementation_defined; 

    /// Specify that the data should not be subject to routing. 
    static const int message_do_not_route = implementation_defined; 
#else 
    BOOST_STATIC_CONSTANT(int, 
     message_peek = boost::asio::detail::message_peek); 
    BOOST_STATIC_CONSTANT(int, 
     message_out_of_band = boost::asio::detail::message_out_of_band); 
    BOOST_STATIC_CONSTANT(int, 
     message_do_not_route = boost::asio::detail::message_do_not_route); 
#endif 

Dựa trên điều này, có vẻ như message_peek, message_out_of_band, và message_do_not_route là những giá trị tốt. Tôi sẽ thử những điều này và xem liệu tôi có thể giúp họ làm việc không.

0

Tôi gặp phải vấn đề tương tự và giải pháp của tôi là sử dụng quá tải không tham số message_flags (http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/basic_datagram_socket/send_to/overload1.html).

Nhược điểm là nếu bạn muốn lỗi mã lỗi báo cáo bạn không thể sử dụng nó (quá tải sử dụng ngoại lệ, và doesnt mất ec param)

+0

Làm cách nào để chuyển 0 thành cờ? Nó sẽ không cung cấp cho bạn những hành vi mong muốn? – russoue

+0

Tôi đã sử dụng 0 và nó có vẻ ổn –

0

param này được chuyển tiếp đến cuộc gọi hệ thống. Ví dụ trong Windows nó được chuyển tiếp trực tiếp đến WSASend. Ý nghĩa của param nên được kiểm tra trong tài liệu OS: WSASend cho Windows nếu không recvmsg.