0
我每20毫秒向服務器發送4個字節大小的UDP消息。客戶端和服務器在同一臺機器上。即使在客戶端停止或重新啓動服務器後,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毫秒的速度,一切都很好。 所以40ms表示25fps,20ms表示50fps。