2008-11-15 18 views

cevap

3

Kesinlikle! Yükseltme ASIO, bu durumda SOCKET'in kendisi olan yerel/temel verilere erişmenizi sağlar.

boost::asio::ip::tcp::socket my_socket; 

Ve en Zaten open veya bind ya aslında my_socket kullanılabilir kılan bazı üye işlev aradım diyelim: Yani, sen olduğunu varsayalım. Sonra, temel SOCKET değerini elde etmek için :

Yani orada var! Boost's ASIO, aksi takdirde yapabileceğinizden çok daha hızlı bir şekilde birçok şey yapmanıza izin verir, ancak normal soket kitaplığı çağrılarına hala ihtiyacınız olan pek çok şey vardır. Bu onlardan biri olur.

+2

, ancak en düşük düzeydeki gönderme/tekrarlama işlevleri, (;;) EAGAIN öğesini açıkça yakalayan aramaların etrafında döngü yapar. Bu, Boost'taki gönderme/alma işlevlerinin% 95'ini atmadığınız sürece SO_ {SND, RCV} TIMEO seçeneklerini kullanılamaz hale getirir. Bu nedenle, seçenekleri belirlemenize izin vermelerinin nedeni budur, çünkü bundan yararlanmanın tek yolu kütüphanenin geri kalanını kullanmamaktır ... – Tom

+0

Mükemmel nokta. Bunu şimdi vurdum. Sucks. –

3

senin hep boost/asio/socket_base.hpp örnekleri uygulayabilir, (mevcut Boost SVN itibariyle) Boost.Asio içine inşa edilecek görünür değil,

typedef boost::asio::detail::socket_option::timeval<SOL_SOCKET, SO_SNDTIMEO> 
    send_timeout; 
typedef boost::asio::detail::socket_option::timeval<SOL_SOCKET, SO_RCVTIMEO> 
    receive_timeout; 

(Açıkçası, sana boost::asio::detail::socket_option ad içine timeval sınıf enjekte demiyorum, ama şu an kullanmak için iyi bir şey gelmiyor olabilir :-P.): ve aşağıdakileri yapın

Düzenleme:tabanlı socket_option::timeval örnek uygulamam:

+0

Sadece yapamam: typedef boost :: asio :: detail :: socket_option :: integer send_timeout; Ve aynı zamanda recv zaman aşımı için mi? Neden de zaman yapısına ihtiyacınız var? –

+0

Hahaha, cevabımın ilk versiyonunda göreceksin, ben de öyle düşündüm. Ancak, http://www.opengroup.org/onlinepubs/009695399/functions/setsockopt.html adresini okuyun ve zaman aşımı değerlerinin, değil, zaman dilimini kullandığını görürsünüz. –

0

Bu soruna kolay bir çalışma, yerel okuma ve yazma işlevlerini kullanmak olabilir. 1sec zaman aşımı ile yazılı İçin

:

struct timeval tv = { 1, 0 }; 
setsockopt(socket.native_handle(), SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); 
ssize_t nsent = ::write(socket->native_handle(), buff, size); 
if (nsent > 0) { 
    BOOST_LOG_TRIVIAL(debug) << "Sent " << nsent << " bytes to remote client " << ep; 
} else if (nsent == 0) { 
BOOST_LOG_TRIVIAL(info) << "Client " << ep << " closed connection"; 
} else if (errno != EAGAIN) { 
    BOOST_LOG_TRIVIAL(info) << "Client " << ep << " error: " <<  strerror(errno); 
} 

1sec zaman aşımıyla okuma için:

struct timeval tv = { 1, 0 }; 
setsockopt(socket.native_handle(), SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); 
ssize_t nread = ::read(socket.native_handle(), buff, audio_buff_size); 
if (nread > 0) { 
} else if (nread == 0) { 
    BOOST_LOG_TRIVIAL(info) << "Source " << source << " server " << host << " closed connection"; 
    break; 
} else if (errno != EAGAIN) { 
    BOOST_LOG_TRIVIAL(info) << "Source " << source << " server " << host << " error: " << strerror(errno); 
    break; 
} 

Bu benim için iyi çalıştı.

İlgili konular