Peut TCP c# client de recevoir et d'envoyer en continu/consécutivement sans sommeil?

C'est à un certain degré de "bases de TCP" question, mais en même temps, je n'ai pas encore trouver une réponse convaincante d'ailleurs, et je crois que j'ai un ok/bon de comprendre les bases de TCP. Je ne suis pas sûr si la combinaison de questions (ou l'une des questions et pendant que j'y suis, la demande de confirmation d'un couple de points) est contre les règles. N'espère pas.

Je suis en train d'écrire un C# de la mise en œuvre d'un client TCP, qui communique avec une application existante contenant un serveur TCP (je n'ai pas accès à son code, donc pas de WCF). Comment puis-je connecter, envoyer et recevoir au besoin, comme de nouvelles infos entrent ou sortent, et en fin de compte se déconnecter. À l'aide de le MSDN code comme un exemple où ils la liste "Envoyer" et "Recevoir" des méthodes asynchrones (ou juste TcpClient), et en ignorant la connecter et déconnecter comme trivial, comment puis-je mieux d'aller sur la permanence de la vérification des nouveaux paquets reçus et en même temps envoyer si nécessaire?

J'ai d'abord utilisé TCPClient et GetStream(), et le code msdn semble encore besoin de la boucle et de sommeil décrit dans un peu (contre-intuitivement), où j'ai exécuter la méthode de réception dans une boucle dans un thread séparé avec un sleep(10) millisecondes, et de l'Envoyer dans la main (ou troisième) thread en tant que de besoin. Cela me permet de m'envoyer l'amende, et la méthode de réception efficacement des sondages, à intervalles réguliers, afin de trouver de nouveaux paquets. Les paquets reçus sont ensuite ajoutés à la file d'attente.

Est-ce vraiment la meilleure solution? Ne devrait-il pas être un DataAvailable événement équivalent (ou quelque chose qui m'échappe dans le code msdn) qui nous permet de recevoir de si, et seulement si, il existe de nouvelles données sont disponibles?

Comme une réflexion après coup, j'ai remarqué que le support puisse être coupé de l'autre côté, sans que le client prend connaissance jusqu'à la prochaine bâclé envoyer. Pour clarifier puis, le client est tenu d'envoyer régulièrement des connexions actives (et de recevoir n'est pas suffisant, envoyer uniquement) afin de déterminer si le socket est toujours en vie. Et la fréquence de la keepalive détermine combien de temps je sais que le lien est en bas. Est-ce exact? J'ai essayé de Sondage, socket.connecté etc seulement de découvrir pourquoi chacun n'aident pas.

Enfin, pour confirmer (je crois pas mais bon de s'assurer), dans le scénario ci-dessus de l'envoi à la demande et de la réception si tcpclient.DataAvailable toutes les dix secondes, peut-il y avoir une perte de données si l'envoi et la réception en même temps? Si dans le même temps, je reçois j'essaie de l'envoyer sera un échec, écraser l'autre ou de tout autre comportement indésirable?

  • Il est le TCPListener ainsi en permanence à l'écoute pour les connexions.
  • recv blocs jusqu'à ce qu'il obtient des données, vous n'avez pas besoin de sommeil pour elle. Si vous voulez plus d'event driven trucs rechercher des sockets asynchrones. IO ports d'achèvement et de ces.
  • Avez-vous utilisé BeginReceive que msdn exemple? Je pense que vous devriez lire sur la façon dont cela fonctionne. Ne asynchrone et qui est ce que vous cherchez.
  • Ok, donc BeginReceive est non bloquant et fait exactement ce que je voulais... Mais pour TcpClient j'aurais besoin de sommeil. Va BeginReceive travailler en tandem avec envoyer à partir d'un autre thread?
  • "pour TcpClient j'aurais besoin de sommeil" -- non. Pour TcpClient, en supposant que vous n'allez pas utiliser le sous-jacent Client socket (et donc l'accès à tous de la même async I/O comme BeginReceive()), vous appeler plutôt GetStream(), et l'utilisation d'e/S asynchrone là, comme BeginRead() ou maintenant ReadAsync().
InformationsquelleAutor commentator8 | 2013-12-20