2010-10-14 7 views
1

J'essaie de savoir si une connexion TCP est abandonnée sur le serveur après un intervalle donné et si j'ai écrit le code suivant;C# TCP Programmation de socket - Déterminer si une connexion a été supprimée

var tcpClient = new TcpClient(); 

tcpClient.Client.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.KeepAlive, true); 

tcpClient.Connect(Ip, Port); 
var status = tcpClient.Connected ? "Connected" : "Failed to Connect"; 

if (connected) 
{ 
    Console.WriteLn(string.Format("Connected - Waiting for '{0}' to see if the connection is dropped", ConnectionDuration)); 
    Thread.Sleep(ConnectionDuration); 
    status = tcpClient.Connected ? "Stayed Connected" : "Connection Dropped"; 
} 

Console.WriteLn(string.Format("Connection Status: '{0}'", status); 

Avec ce code, si une connexion est établie initialement, je recevrai toujours le message d'état "Reste connecté". Étant donné que le serveur est en dehors de notre société, il n'est pas souhaitable d'écrire des données sur le socket. Existe-t-il un autre moyen de déterminer si la connexion a été abandonnée?

Merci

Répondre

1

faire un non-blocage zéro octet Envoyer appel, si vous obtenez un code d'erreur WOULDBLOCK ou le succès, vous êtes toujours connectés.

+1

Vous êtes tout à fait correct, je vais essayer cela et marquez comme acceptée si elle fonctionne - http: // stackoverflow .com/questions/1363682/comment-faire-je-faire-un-non-bloquant-socket-appel-en-c-à-déterminer-connexion-statut – CityView

0

Je ne pense pas que ce fait ce que vous voulez:

vrai si la prise du client a été connecté à une ressource à distance comme de l'opération la plus récente; sinon, faux.

Says MSDN

En outre, régler l'option keepalive envoie des données au niveau de tcp, il est tout simplement pas vous envoyer les données, mais l'os.

Je pense que vous devrez construire quelque chose autour select

HTH

Mario

Questions connexes