2017-09-06 39 views
0

我正在接收來自ITCH協議服務器的大量數據(頻繁的小消息)。難以解釋TcpClient的延遲

我的應用程序運行良好,所有消息都被正確解析。然而,當我知道什麼時候(除了代碼在「ReadByte」中設置)之外,我得到了神祕的延遲。

TcpClient simpleTcp = new TcpClient(serverAddress, serverPort); 
simpleTcp.NoDelay = true; 
simpleTcp.Client.NoDelay = true;     
simpleTcp.Client.ReceiveBufferSize = 1024; 
simpleTcp.ReceiveBufferSize = 1024; 
simpleTcp.ReceiveTimeout = 5000; 


NetworkStream tcpStream = simpleTcp.GetStream(); 

//Send login and subscciptions... 

while (true) 
{ 
    lock (TcpLock) 
    { 
     int abyte = tcpStream.ReadByte(); 
     try 
     { 
      LbTime.Stopwatch.Restart(); 
      Console.WriteLine("\n>>>>GetMessage Start: " + DateTime.UtcNow.ToString("HH:mm:ss.fff") + " " + LbTime.Stopwatch.ElapsedMilliseconds.ToString("F0")); 

      //Process message (Complex) 

      Console.WriteLine(">>>>GetMessage End: " + LbTime.Stopwatch.ElapsedMilliseconds.ToString("F0") + " Now: " + DateTime.UtcNow.ToString("HH:mm:ss.fff") + "\n"); 
     } 
     catch (Exception err) 
     { 
      throw; 
     } 
    } 
    } 

我顯示處理開始和結束的時間。但是,當我收到後面的消息時 - 與收到消息的時間差別很大。即我遲到了。

我已經在2臺機器上試了這個,後者沒有其他的東西在運行,有時候我仍然會有神祕的延遲。

我承諾,這是非常困難的幫助,因爲我無法提供一個工作示例,因爲它依賴於連接到私人ITCH協議服務器。

如果任何人可以擺脫一些將是偉大的光。

+0

「遲到」多晚?數據通過網絡需要花費時間,並且由於緩衝,發送端可能會有延遲。 –

+0

200+ ms。這是一個xConnect非常快速的內部鏈接 – ManInMoon

+0

好吧,聽起來像它可能是在發送端緩衝的Nagle算法。或者只是系統時鐘的差異 - 兩個相距200毫秒的系統時鐘非常可信。 –

回答

0

這種延遲對我來說仍然難以解釋。然而,類似問題的幾個答案表明使用原始套接字會更好。

我用Socket替換了我所有的Stream和NetworkStreams,現在Socket.Receive()工作時沒有任何臨時延遲。