2010-12-05 47 views
8

我正在做一個UDP C/S。我遇到了服務器每秒可以接收的數據數量問題。Delphi中的UDP服務器和客戶端

我已經測試了10,100,1000個數據消息批量發送到服務器,10,100沒有問題收到。發送1000時,只收到300〜400個。所有測試均在本地完成。

我已經嘗試過使用ICS的twsocket和Synapse的tudpblocksocket來實現服務器。兩者都出現在上面的同樣的問題。

能否向我解釋爲什麼會發生這種情況,以及如何提高服務器性能。使用TUDPBlockSocket

代碼...

while not Terminated do 
begin 
    try 
    sz := FUDPServer.WaitingData; 
    if sz > 0 then 
    begin 
     FUDPServer.RecvBuffer(mem.Memory, sz); 
     mem.Seek(0, 0); 
     AMessage := fFormats.ReadFromStream(mem); 
     DoMessageReceived(FUDPServer.RemoteSin.sin_addr, AMessage); 
    end; 

    finally 

    end; 
end; 

...

使用代碼ICS

...

procedure TShapeServer.WSocketDataAvailable(Sender: TObject; ErrCode: Word); 
... 
begin 
    SrcLen := SizeOf(Src); 
    stream := TMemoryStream.Create; 
    stream.SetSize(INT_BUFFER_SIZE); 
    Inc(fMessageReceived); 
    try 
    Len := FUDPServer.ReceiveFrom(stream.Memory, stream.size, Src, SrcLen); 
    if (FSenderAddr.S_addr = INADDR_ANY) or 
     (FSenderAddr.S_addr = Src.Sin_addr.S_addr) then 
    begin 

     while stream.Position < Len do 
     begin 
     try 
      AMessage := fFormats.ReadFromStream(stream); 
      DoMessageReceived(Src.Sin_addr, AMessage); 
     except 
      break; 
     end; 
     end; 

    end; 

    finally 
    stream.Free; 
    end; 
end; 
... 
+0

你可以使用wireshark記錄環回udp流量(在Windows上它與winpcap一起工作)? – 2010-12-05 15:58:45

+0

我還會研究微軟每秒數據包的「安全」限制。 IIRC,tcpip.sys報告封蓋行動事件日誌 – 2010-12-05 16:16:52

+0

我試着wireshark。不知道是否做錯了,但有迴環適配器供我選擇。 :(偉大的工具壽 – Darkerstar 2010-12-06 14:31:40

回答

13

UDP不保證消息傳遞 - 如果緩衝區中沒有地方,數據包會毫不猶豫地丟棄。 如果您需要保證交付,請使用TCP並在TCP之上構建基於消息的通信方案。或使用我們已有的MsgConnect產品。十字軍注意事項:MsgConnect有一個開源版本。

3

如果您想使用UDP協議並且不丟失任何數據包,您必須爲您的程序添加一個確認機制,因爲UDP數據包在傳輸過程中可能會丟失。這種ACK機制已經在TCP協議中實現,所以它是性能和一致性的最佳選擇。

如果您不能使用TCP(也許您的客戶端沒有足夠的CPU能力或RAM來處理TCP),請考慮使用一些易於編碼基於UDP的協議,如TFTP。我們通過我們的SynCrtUnit實現了TFTP客戶端和服務器,但在Synapse中有這樣的組件。但TFTP速度較慢,因爲它等待每個發送數據包的ACK信號。所以你不會丟失任何數據包,但速度會比TCP差。

去年,我在基於DOS的自動引擎中實現了Delphi中的TFTP服務器,然後是TP 7中的TFTP客戶端。這工作很好,兩端共享了一些對象結構。 TFTP/UDP/IP協議棧採用純TP 7編碼,只有靜態分配的內存,並且工作得很好。

但是,如果你沒有這麼「低CPU」的要求,而是考慮使用TCP/IP而不是UDP/IP。如果你需要一些廣播例如,然後使用UDP,但有某種ACK機制。