2011-08-17 3 views
9

Recentemente ho iniziato a lavorare con Boost Asio. Ho notato che lo receive method of a TCP socket accetta un message_flags come parametro. Tuttavia, la documentazione che ho trovato per message_flags dice solo che è un intero senza specificare i valori validi. Quali sono i valori che possono essere assegnati a un message_flags e cosa significano?Boost Asio message_flags

risposta

11

Ho cercato per un po 'e alla fine ho provato a cercare nel codice sorgente di Boost. Ho trovato questo in 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 

Sulla base di questo, sembra che message_peek, message_out_of_band, e message_do_not_route sono i valori possibili. Ho intenzione di provare e vedere se riesco a farli funzionare.

0

Ho riscontrato lo stesso problema e la mia soluzione era di utilizzare il sovraccarico che non accetta il parametro message_flags (http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/basic_datagram_socket/send_to/overload1.html).

Unico inconveniente è che se si vuole errore codice di segnalazione degli errori non puoi usarlo (sovraccarico usa eccezioni, e non prende CE param)

+0

Che ne dici di passare 0 come bandiera? Non ti darà il comportamento desiderato? – russoue

+0

Ho usato 0 e mi sembrava soddisfacente –

0

Questo parametro viene inoltrata a chiamata di sistema. Ad esempio in Windows viene inoltrato direttamente a WSASend. Il significato di param deve essere controllato nei documenti del sistema operativo: WSASend per Windows altrimenti recvmsg.