6
votes

Comment faire un appel de prise non bloquante dans C # pour déterminer l'état de la connexion?

Les documents MSDN pour la propriété connectée sur Socket Soignent les suivants:

la valeur de la propriété connectée reflète l'état de la connexion à la fois de l'opération la plus récente. Si Vous devez déterminer le courant état de la connexion, faire un Non bloque, zéro octet Envoyer un appel. Si L'appel retourne avec succès ou jette un code d'erreur de wawouldblock (10035), puis la prise est toujours lié; Sinon, la prise est non plus connecté.

J'ai besoin de déterminer l'état actuel de la connexion - comment puis-je créer un appel non bloquant et zéro-octet?


1 commentaires

Utiliserait HTTP Keepalive Soyez-vous bien?


3 Réponses :


3
votes

0 commentaires

8
votes

L'exemple en bas de la documentation MSDN pour le Socket.Connected Propriété (au moins la version .NET 3.5) montre comment faire ceci:

// .Connect throws an exception if unsuccessful
client.Connect(anEndPoint);

// This is how you can determine whether a socket is still connected.
bool blockingState = client.Blocking;
try
{
    byte [] tmp = new byte[1];

    client.Blocking = false;
    client.Send(tmp, 0, 0);
    Console.WriteLine("Connected!");
}
catch (SocketException e) 
{
    // 10035 == WSAEWOULDBLOCK
    if (e.NativeErrorCode.Equals(10035))
        Console.WriteLine("Still Connected, but the Send would block");
    else
    {
        Console.WriteLine("Disconnected: error code {0}!", e.NativeErrorCode);
    }
}
finally
{
    client.Blocking = blockingState;
}

 Console.WriteLine("Connected: {0}", client.Connected);


0 commentaires

0
votes

Il suffit de fournir des informations supplémentaires en fonction de l'expérience: les commentaires au bas des versions 3.5 et 4 de cette page de documentation pour socket.connect Décrivez mon expérience - L'exemple n'a tout simplement pas fonctionné. J'aimerais vraiment que je sache pourquoi cela fonctionne pour certains et pas d'autres.

En tant que travail autour, malgré ce que dit la documentation, j'ai changé l'échantillon pour envoyer le 1 octet sans indicateurs. Cela a mis à jour avec succès l'état de propriété connectée et équivaut à envoyer un paquet de conservation à un intervalle.


0 commentaires