Мое (выявленное как неверное) понимание заключается в том, что, если я попытаюсь получить из сокета с этим набором опции, то он будет ждать продолжительности, указанной в соответствии с clock_monotonic (или, может быть, clock_boottime , но мне не волнует разница), чтобы получить пакет. Если эта полная продолжительность прошла и не было получено никакого пакета, то он вернется с ошибкой, указывающей, что за это время ничего не произошло. Раннее, например, путем получения и возврата пакета, получения сигнала или наличия некоторой ошибки. А в загруженной системе поток, который назвал этот метод, может потребоваться дополнительное время, пока ЦП станет доступным для запуска. Однако, учитывая, что ничто не делает метод выходить на раннем этапе и что ядра процессора не находятся под спорами, я ожидаю, что вызов recv в сокете с so_rcvtimeo set вернет eagain , и что количество времени, занятого в соответствии с clock_monotonic , будет продолжительностью, которую я установил, плюс небольшая дополнительная задержка, добавленная ядром, выполняющим бухгалтерский бухгалтер и планирование перед запуском. > Тем не менее, я запустил код C, который выглядит так в цикле: < /p>
Код: Выделить всё
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
clock_gettime(CLOCK_MONOTONIC, &start_time);
recv(sock, buf, 512, 0);
clock_gettime(CLOCK_MONOTONIC, &end_time);
Где Разнос растет моя модель происходящего от того, что на самом деле происходит? И сколько времени длится recv вызов, гарантированно ждал, если он сообщает EAGAIN ? Мне нужна жесткая нижняя часть во время ожидания этого случая для моего проекта.
Подробнее здесь: https://stackoverflow.com/questions/794 ... n-expected
Мобильная версия