Un moyen facile de contourner ce problème serait d'utiliser les fonctions natives de lecture et d'écriture.
Pour écrire avec délai 1sec:
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);
}
Pour la lecture avec délai d'attente 1sec:
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;
}
Cela a bien fonctionné pour moi.
toutes sauf les fonctions d'envoi/recv de plus bas niveau ont pour (;;) boucles autour des appels qui interceptent explicitement EAGAIN. Cela rend les options SO_ {SND, RCV} TIMEO inutiles à moins que vous ne rejetiez 95% des fonctions d'envoi/de réception dans Boost. Ainsi, il est inutile qu'ils vous permettent de définir les options, car la seule façon d'en profiter est de ne pas utiliser le reste de la bibliothèque ... – Tom
Excellent point. Je viens de frapper ça maintenant. Suce. –