Est-il un moyen de sondage d'une prise en C # que lorsque quelque chose est disponible pour la lecture?

StackOverflow https://stackoverflow.com/questions/1249643

  •  12-09-2019
  •  | 
  •  

Question

Je me demande s'il y a un moyen de sondage d'une prise en c # quand une seule des conditions (les données sont disponibles pour la lecture) est satisfaite, je suis au courant de la socket.Poll méthode, mais cela peut retourner vrai si un certain nombre des 3 conditions spécifiées renvoie true comme indiqué ici: MSDN: Socket.Poll

Était-ce utile?

La solution

Selon la documentation MSDN, il y a trois causes qui renvoient true pour

Poll(microSeconds, SelectMode.SelectRead);

  1. si Listen() a été appelée et une connexion est en attente
  2. Si les données sont disponibles pour la lecture
  3. Si la connexion a été fermée, remise à zéro, ou terminé

Voyons voir si nous pouvons les distinguer:

  1. Vous savez toujours si Listen() a été appelé avant, de sorte que vous n'avez pas besoin de considérer cette cause si vous avez pas.
  2. Ok, vous allez pour cela.
  3. signifie que vous ne pouvez pas rester dans l'appel et ont besoin de savoir ce qui est arrivé le sondage (). Une option est de vérifier immédiatement l'état de la prise après Poll() retourné.

Conclusion:

  1. doit pas être considéré comme

  2. et 3. peut être manipulé en vérifiant l'état de prise à chaque fois vrai est retourné.

Je pencherais pour (non testé):

if (s.Poll(microSeconds, SelectMode.SelectRead)))
{
  if (!s.Connected)
    // Something bad has happened, shut down
  else
    // There is data waiting to be read"
}

Autres conseils

Vous pouvez utiliser la propriété Socket disponible. Il retourne le volume de données est disponible à lire.

trouvé quelque chose dans la classe NetworkStream. NetworkStream.DataAvailable renvoie true si les données sont disponibles pour la lecture. Objet de NetworkStream est retourné affaire à TcpListener et TcpClient. Ceci est un niveau d'abstraction plus élevé que la prise.

J'ai trouvé aucun moyen de venir de Socket à NetworkStream. Un NetworkStream utilise une douille et est la représentation de flux d'une douille. Mais je ne sais pas ce que le NetworkStream fait là-bas avec la prise.

Vous pouvez utiliser l'appel système select () sur la poignée sous-jacente.

Vous pouvez utiliser la méthode Select () au lieu de poll (). En fait, quand on regarde dans Socket.Poll avec ILSpy (outil de réflecteur) le code interne demande de sélection du support.

En outre, appelant le sondage () dans une boucle serrée augmentera l'allocation de mémoire comme il le fait à chaque appel un nouveau IntPtr []. Sélectionnez l'appel () vous permet de réutiliser les tableaux au lieu d'allouer de nouvelles sous le capot.

true si Ecoute a été appelé et une connexion est en attente; -ou- vrai si les données sont disponibles pour la lecture; -ou- vrai si la connexion a été fermée, remise à zéro, ou terminé; sinon, retourne false.

Je comprends que vous voulez vérifier si la deuxième option est le retour vrai? Après avoir vérifié si le sondage retourne vrai, vous pouvez vérifier si la connexion est ouverte, cela signifie; pas de connexion, fermé, réinitialiser ou terminé.

Si elle est ouverte, il est la deuxième option return true.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top