Простой подход к этой проблеме заключается в использовании собственных функций чтения и записи.
для записи с 1 сек таймаута:
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);
}
Для чтения с 1 сек таймаута:
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;
}
Это работало отлично для меня.
Не могу я просто сделать: typedef boost :: asio :: detail :: socket_option :: integer send_timeout; И то же самое для тайм-аута recv? Зачем вам нужна структура timeval? –
2008-11-20 00:29:12
Хахаха, вы увидите в первой версии моего ответа, вот что я подумал. Однако прочитайте http://www.opengroup.org/onlinepubs/009695399/functions/setsockopt.html, и вы увидите, что значения таймаута используют timeval, а не int. – 2008-11-20 04:43:49