2011-10-12 93 views
1

假設我有一個有多個客戶端(UDP)的服務器。每當從客戶端收到一個數據包時,服務器將花費1秒處理數據包,並在處理後立即向所有客戶端發送一個新數據包。在一個套接字上的多個UDP數據包

如果10個數據包在0.1秒內到達,服務器是否可以做到這一點?換句話說,是否能夠在處理完第一個接收到的數據包之後立即向每個客戶端發送一個新數據包? (我有一個插座會得到由9個其他未讀取數據包「堵塞」了的感覺)

服務器循環將是這樣的:

while (1) { 
    read_a_packet() 
    process_packet() 
    send_new_packet_to_all_clients() 
} 

回答

0

傳入UDP數據包放入緩衝區,以便查詢。如果你的處理速度足夠慢以便用數據包填充套接字緩衝區,那麼下面的數據包將被丟棄。

另請參閱How does a Linux socket buffer overflow?C++ UDP sockets packet queuing(也請查看評論)。

+0

我不關心如何填充緩衝區,但是使用這個: 如果套接字緩衝區部分被填滿,當我嘗試發送一個數據包時會發生什麼? – user990814

+0

緩衝區已​​滿時,您可能會擔心丟失數據包。至於發送數據包 - 無論套接字輸入的狀態如何,您都可以隨時發送數據包。 –

+0

好的謝謝。其實我給的數字是誇張的,在我的應用程序中,處理時間通常遠低於接收到的數據包之間的時間,但我想知道如果正在處理另一個數據包時收到數據包會發生什麼情況。 – user990814

0

根據您自己的定義,process_packet()需要1秒鐘的時間才能運行。線程一次只能做一件事,因此單個線程中的這種循環服務器將需要10秒來處理10個數據包。所以要麼加速process_packet()小於1秒,要麼運行多個處理線程,以便可以並行處理多個數據包。

相關問題