Łatwym obejściem tego problemu byłoby wykorzystanie natywnych funkcji odczytu i zapisu.
Do pisania z limitu czasu 1 s:
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);
}
Do czytania z limitu czasu 1 s:
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;
}
To działało w porządku dla mnie.
wszystkie oprócz funkcji najniższego poziomu wysyłania/recv mają dla (;;) pętle wokół wywołań, które jawnie wychwytują EAGAIN. To skutecznie czyni opcje SO_ {SND, RCV} TIMEO bezużytecznymi, chyba że odrzucisz 95% funkcji wysyłania/odbierania w trybie Boost. W związku z tym jest to kwestia, która pozwala na ustawienie opcji, ponieważ jedynym sposobem, aby z niego skorzystać, jest niewykorzystywanie reszty biblioteki ... – Tom
Doskonały punkt. Właśnie to uderzyłem. Do kitu. –