我每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。
答案 0 :(得分:0)
要修改套接字缓冲区大小,您必须使用setsockopt()
函数并更改SO_RCVBUF
和/或SO_SNDBUF
选项。