2013-10-13 50 views
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。

回答

0

要修改套接字緩衝區大小,您必須使用setsockopt()函數並更改SO_RCVBUF和/或SO_SNDBUF選項。

相關問題