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ı.
, 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
Mükemmel nokta. Bunu şimdi vurdum. Sucks. –