我每 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。