2017-09-06 25 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のアルゴリズムのように聞こえます。システムクロックの違いだけでも、200ms離れた2つのシステムクロックは非常に信じられます。 –

答えて

0

この遅延は私には分かりませんでした。しかし、同様の質問に対するいくつかの答えは、Rawソケットを使用するほうが良いことを示唆していました。

私はすべてのストリームとネットワークストリームをSocketに置き換えました。そして今、Socket.Receive()は特別な遅延なしで動作します。

関連する問題