即使在客户端停止或服务器重新启动后,UDP消息仍会到达

时间:2013-10-13 19:25:13

标签: c++ sockets udp buffer

我每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 ms表示25 fps,20 ms表示50 fps。

1 个答案:

答案 0 :(得分:0)

要修改套接字缓冲区大小,您必须使用setsockopt()函数并更改SO_RCVBUF和/或SO_SNDBUF选项。