3

TFTP の C 実装でタイムアウト メカニズムを実装しようとしていますが、一般的なヘルプを探しています。

私が疑問に思っているのは、タイムアウトの状況を管理する方法です。私が使用した早すぎるタイムアウトメカニズムは、シグナル/アラーム機能を使用していますが、どういうわけか、タイムアウトの処理方法に行き詰まっています。つまり、パケット (ack またはデータ) が失われ、タイムアウトが発生した場合、前のパケットを送り返す方法またはサーバーに確認します。

4

1 に答える 1

5

可能であれば、信号と警報を避けてください。

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
    }
}

select の使用例:

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
    }

}
于 2013-05-11T21:22:51.573 に答える