0

我每 20 毫秒向服务器发送 4 字节大小的 UDP 消息。客户端和服务器在同一台机器上。

我在接收如此大量的消息时遇到延迟。停止并从客户端退出后,服务器继续接收消息。我想必须有一些内部套接字缓冲区已被填充。

服务器是用 C++ 制作的。在服务器端,我正在使用 10 个缓冲区的数组,每个缓冲区 64 字节,并且正在等待在这里接收每个 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);

客户端关闭后,我需要以某种方式停止接收消息。如果服务器重新启动,消息仍然会到达,直到某个 INTERNAL 缓冲区为空。

现在我有两个问题?

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 回答