Recvmsg возвращает EAGAIN после того, как выбранный дескриптор файла отчета готовC++

Программы на C++. Форум разработчиков
Ответить
Гость
 Recvmsg возвращает EAGAIN после того, как выбранный дескриптор файла отчета готов

Сообщение Гость »

В моем приложении на Linux я отправляю и получаю данные, используя сокет UDP. Отправка и получение выполняются в двух отдельных потоках. Отправка работает нормально.
В моей функции приема я постоянно получаю сообщение 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»