1

select()UDP ソケット転送を使用してタイムアウトを作成しようとしています。intからclientにを送信しserver、300 ミリ秒待って、ACK が得られない場合はパケットを再送信します。タイムアウトでこれを適切に設定する方法がわかりません。私がオンラインで収集したものとクラスからのメモからselect、受信側で使用する必要があります.

サーバーのクライアントは、1 ~ 100 の数字を送受信します。ランダムにパケットをドロップする別のrouterシミュレートされたコードがあります

クライアント側のコードは次のとおりです

int sent = 1;
int received = 1;

    for (int i = 0; i < 100; i++)
    {
        string sent1 = to_string(sent);
        char const *pchar = sent1.c_str();
        if(!sendto(s, pchar, sizeof(pchar), 0, (struct  sockaddr*) &sa_in, sizeof(sa_in)))
            cout << "send NOT successful\n";
        else
        {
            cout << "Client sent " << sent << endl;
            sent++;
        }
        // receive
        fd_set readfds; //fd_set is a type
        FD_ZERO(&readfds); //initialize 
        FD_SET(s, &readfds); //put the socket in the set

        if(!(outfds = select (1 , &readfds, NULL, NULL, & timeouts))) 
            break;
        if (outfds == 1) //receive frame
        {
            if (!recvfrom(s, buffer2, sizeof(buffer2), 0, (struct sockaddr*) &client, &client_length))
                cout << "receive NOT successful\n";
            else
            {
                received = atoi(buffer2);
                cout << "Client received " << received << endl;
                received++;
            }
        }
    }

コードは、逆になっていることを除いて、受信側でも同じです。つまり、最初に受信してから送信します。

私のコードはタイムアウトをまったく利用していません。これは基本的に私がやりたいことです:

send packet(N)
    if (timeout)
        resend packet(N)
    else
        send packet(N+1)
4

1 に答える 1

2

受信者がタイムアウトになった場合は、送信者に通知するか、送信者に通知しない必要があります。つまり、NACK ベースのプロトコルまたは ACK ベースのプロトコルのいずれかを実装する必要があります。

于 2013-11-04T05:01:35.703 に答える