2011-08-17 13 views
9

Niedawno rozpocząłem współpracę z Boost Asio. Zauważyłem, że receive method of a TCP socket przyjmuje jako parametr parametr message_flags. Jednak dokumentacja, którą znalazłem dla message_flags, mówi tylko, że jest liczbą całkowitą bez podania poprawnych wartości. Jakie są wartości, które można przypisać do zmiennej message_flags i co one oznaczają?Zwiększ Asio message_flags

Odpowiedz

11

Szukałem przez chwilę i wreszcie próbowałem zajrzeć do kodu źródłowego Boost. Znalazłem to w 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 

Na tej podstawie, wygląda message_peek, message_out_of_band i message_do_not_route są możliwe wartości. Zamierzam spróbować i zobaczyć, czy mogę je zmusić do pracy.

0

Napotkano ten sam problem, a moim rozwiązaniem było użycie przeciążenia, które nie wymaga parametru message_flags (http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/basic_datagram_socket/send_to/overload1.html).

Minusem jest to, że jeśli chcesz błąd kod błędu raportowania nie można go używać (przeciążenie wykorzystuje wyjątek, a nie robi się ec param)

+0

Co powiesz na przekazanie 0 jako flagi? Czy nie da ci pożądanego zachowania? – russoue

+0

Użyłem 0 i wydawało mi się dobrze –

0

param ten jest przekazywany do wywołania systemowego. Na przykład w systemie Windows jest przekazywana bezpośrednio do WSASend. Znaczenie paramu powinno być sprawdzone w dokumentach systemu operacyjnego: WSASend dla Windows inaczej recvmsg.