Eine einfache Lösung für dieses Problem wäre die Verwendung der systemeigenen Lese- und Schreibfunktionen.
Zum Schreiben mit 1sec Timeout:
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);
}
Für mit 1sec Timeout zu lesen:
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;
}
Dies funktionierte gut für mich.
alle außer den niedrigsten send/recv Funktionen haben für (;;) Schleifen um die Aufrufe, die explizit EAGAIN abfangen. Dies macht effektiv SO_ {SND, RCV} TIMEO Optionen nutzlos, wenn Sie 95% der Sende-/Empfangsfunktionen in Boost verwerfen. Daher ist es strittig, dass sie Ihnen erlauben, die Optionen zu setzen, weil der einzige Weg, um davon zu profitieren, ist, den Rest der Bibliothek nicht zu verwenden ... – Tom
Ausgezeichneter Punkt. Ich habe das jetzt gerade getroffen. Saugt. –