2017-09-06 4 views
0

Je reçois de grandes quantités de données (petits messages fréquents) provenant d'un serveur de protocole ITCH.Difficulté à expliquer le retard dans TcpClient

Mon application fonctionne bien dans la mesure où tous les messages sont correctement analysés. Cependant, je reçois des retards mystérieux quand (pour autant que je sache) rien ne se passe, sauf que le code est réglé sur "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; 
     } 
    } 
    } 

Je montre l'heure au début et à la fin du traitement. Cependant, quand je reçois un message plus tard - le temps diffère grandement du temps enfoui dans le message reçu. C'est à dire. Je reçois le message en retard.

Je l'ai essayé sur 2 machines, cette dernière n'avait rien d'autre fonctionnant dessus, et je reçois encore parfois des retards mystérieux. Je suis d'accord avec ceci est très difficile à aider car je suis incapable de fournir un exemple de travail parce que cela dépend de la connexion à un serveur de protocole privé ITCH.

Si quelqu'un peut apporter une lumière qui serait géniale.

+0

Quelle est la date de retard? Il faut du temps pour que les données traversent un réseau, et il peut y avoir un retard du côté de l'envoi du fait de la mise en mémoire tampon de toute façon. –

+0

200+ ms. C'est sur un lien interne très rapide xConnect – ManInMoon

+0

D'accord, on dirait que cela pourrait être l'algorithme de Nagle avec la mise en mémoire tampon du côté de l'envoi. Ou juste la différence dans les horloges du système - deux horloges système étant 200ms d'intervalle est très crédible. –

Répondre

0

Ce délai est resté inexplicable pour moi. Cependant, plusieurs réponses à des questions similaires ont suggéré que l'utilisation de Sockets bruts serait préférable.

Je remplace tous mes Stream et NetworkStreams avec Socket et maintenant le Socket.Receive() fonctionne sans aucun retard ad-hoc.