0

20 ミリ秒ごとに 4 バイト サイズの UDP メッセージをサーバーに送信しています。クライアントとサーバーは同じマシン上にあります。

このような膨大な量のメッセージを受信する際に遅延が発生しています。クライアントを停止して終了した後、サーバーはメッセージを受信し続けます。満たされた内部ソケットバッファがいくつかあるに違いないと思います。

サーバーは C++ で作成されています。サーバー側では、それぞれ64バイトの10個のバッファの配列を使用しており、ここで各UDPメッセージを受信するのを待っています

static const int BUFFER_SIZE = 64;
static const int BUFFER_QUEUE_COUNT = 10;

int num = recvfrom(sSocket, buffer[bufferSelector], BUFFER_SIZE, 0, (SOCKADDR *)&senderAddr, &senderAddrSize);

クライアントが閉じられた後、どうにかしてメッセージの受信を停止する必要があります。サーバーが再起動された場合、内部バッファーが空になるまで、メッセージは引き続き到着します。

質問が 2 つあります。

1. 内部バッファのサイズを変更するには? または
2. サーバーのアーキテクチャを変更して、受信速度を上げるにはどうすればよいですか?

私の現在のアーキテクチャは、次のコードに基づいています。

while(true)
{
    if(server->State == Stopping) break;

    bool result = server->StartReceiving(*msg[msgIndex]);
    if( result == true  &&  server->State != Stopping)
    {
       server->numErrosCounter = 0;
       msg[msgIndex]->Tag = (void *)server;
       _beginthread(ActionThread, (unsigned int)0, msg[msgIndex]);
    }
    else if( result == false){
    }

...

}


bool UDPCommunicator::StartReceiving(Message &msg)
{
    State = Listening;
    PrintStateLn();

    sockaddr_in senderAddr;
    int senderAddrSize = sizeof(senderAddr);

    //int num = recvfrom(sSocket, buffer[bufferSelector], BUFFER_SIZE, NULL, NULL, NULL); // this works !!!
    int num = recvfrom(sSocket, buffer[bufferSelector], BUFFER_SIZE, 0, (SOCKADDR *)&senderAddr, &senderAddrSize);

...

}

追加情報
クライアントが各メッセージを 40 ミリ秒未満の遅延で送信している場合、たとえば 35、30、25、20 など、応答が遅いという問題があります。40 ミリ秒の速度では、すべて問題ありません。したがって、40 ミリ秒は 25 fps を意味し、20 ミリ秒は 50 fps を意味します。

4

1 に答える 1

0

ソケットバッファサイズを変更するには、setsockopt()関数と変更SO_RCVBUFおよび/またはSO_SNDBUFオプションを使用する必要があります。

于 2013-10-13T19:35:28.863 に答える