Реализация тайм-аута в C для TFTP

Я пытаюсь реализовать механизм тайм-аута в моей реализации TFTP, и я ищу некоторую общую помощь.

Что мне интересно, так это как управлять ситуацией тайм-аута. Механизм преждевременного тайм-аута, который я использовал, связан с функциями сигнала / будильника, но каким-то образом я застрял в том, как обрабатывать мои тайм-ауты, то есть, если пакет (ack или данные) пропущен, и возникает тайм-аут, как отправить обратно предыдущий пакет или Доступ к серверу.

1 ответ

Решение

Избегайте сигнала и тревоги, если это возможно.

Либо используйте опцию сокета SO_RCVTIMEO, либо просто используйте select с тайм-аутом T секунд.

Если вызов select() возвращается, и ваш сокет не находится в наборе для чтения, или если recvfrom возвращается с ошибкой тайм-аута, вы можете предпринять соответствующие действия в своем коде.

Пример использования тайм-аута:

timeval tv = {0,0};
tv.tv_sec = 5;
socklen_t optionlength = sizeof(tv);
setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, optionlength);

while (1)
{
    result = recvfrom(s, buffer, bufferlength, 0);
    if (result == -1) && ((errno == EAGAIN) || (errno == EWOULDBLOCK)) )
    {
       // handle timeout
    }
    else if (result == -1)
    {
       // handle critical error
    }
    else
    {
       // process next packet
    }
}

Пример выбора использования:

while (1)
{
    timeval tv = {0,0};
    tv.tv_sec = 5;
    fd_set readset = {};
    FD_ZERO(&readset);
    FD_SET(s, &readset);

    select(s+1, &readset, NULL, NULL, &tv);

    if (FD_ISSET(s, &readset))
    {
        result = recvfrom(s, buffer, bufferlength, 0);
        if (result == -1)
        {
            // handle error
        }
        else
        {
            // process packet
        }
    }
    else
    {
       // handle timeout
    }

}
Другие вопросы по тегам