В моей функции приема я постоянно получаю сообщение EAGAIN Ресурс временно недоступен. Я понимаю, что Recvmsg может вернуть EAGAIN, когда я вызываю его с флагом MSG_DONTWAIT. Но поскольку я сначала вызываю select, чтобы проверить, доступно ли что-нибудь для чтения, я не ожидаю такого результата.
Функция вызывается в цикле while и select
Функция вызывается в цикле while и select возвращает результат постоянно быстрее, чем тайм-аут, поэтому сообщение Recvmsg не удалось (11). Ресурс временно недоступен рассылается на консоль спамом с гораздо большей скоростью, чем время ожидания или получение каких-либо пакетов.
Код: Выделить всё
// Passed values as comments
MySocket::ReceiveRet MySocket::Receive(
void *data /* Pointer to std::array on stack*/,
size_t max_len /* = 170 */,
suseconds_t usTimeout /* = 1000*/
)
{
static uint64_t rcvId = 0;
MySocket::ReceiveRet ret;
if (m_socket == -1)
{
ret.errorCode = -1001;
return ret;
}
struct timeval delta;
memset(&delta, 0, sizeof(delta));
delta.tv_usec = usTimeout;
fd_set readfs, errorfs;
FD_ZERO(&readfs);
FD_ZERO(&errorfs);
FD_SET(m_socket, &readfs);
//FD_SET(m_socket, &errorfs);
// Check for new packages
// See for '+1' reason https://stackoverflow.com/questions/24539031/what-exactly-is-the-first-argument-of-select-function
int retSelct = select(m_socket + 1, &readfs, 0, &errorfs, &delta);
if (retSelct
Источник: [url]https://stackoverflow.com/questions/78159286/recvmsg-returns-eagain-after-select-reports-file-descriptor-is-ready[/url]
Мобильная версия