2010-10-13 2 views
3

Salut j'ai un bouton de déconnexion événement click dans mon application serveur comme follows.Before il continue, il alertera d'autres clients en envoyant un command.After «/de sortie » qu'il va arrêter sa connexion.Arrêter un Asyncronous TCP Application Aprčs

private void stopButton_Click(object sender, EventArgs e) 
    { 
     byte[] exit_command = Encoding.ASCII.GetBytes("/exit"); 
     g_server_conn.BeginSend(exit_command, 0, exit_command.Length, SocketFlags.None, new AsyncCallback(Send), g_server_conn); 
     g_server_conn.Shutdown(SocketShutdown.Both); 
     g_server_conn.Close(); 
    } 

Le problème est que le serveur exécute la méthode Socket.BeginRecieve() tout le temps. Comment pouvons-nous dire à la méthode begin recieve pour arrêter son fonctionnement afin que je puisse fermer correctement.

private void Accepter (IAsyncResult IAR) {

 Socket winsock = (Socket)iar.AsyncState; 
     g_server_conn = winsock.EndAccept(iar); 


     //Function that exchanges names of each other 
     NewClient(g_server_conn); 

     Socket server_conn = g_server_conn; 

     chat_msg = new byte[1024]; 
     server_conn.BeginReceive(chat_msg, 0, chat_msg.Length, SocketFlags.None, new AsyncCallback(Recieve), server_conn); 

    } 

    private void Recieve(IAsyncResult iar) 
    { 
     Socket server_conn = (Socket)iar.AsyncState; 
     server_conn.EndReceive(iar); 

     //If clients shutdown connection,Server recieves /exit command 
     if (Encoding.ASCII.GetString(chat_msg, 0, chat_msg.Length) == "/exit") 
     { 
      g_server_conn.Shutdown(SocketShutdown.Both); 
      g_server_conn.Close(); 
      return; 
     } 
     SetLabel(client_name, chatListBox); 
     SetLabel(Encoding.ASCII.GetString(chat_msg), chatListBox); 

     chat_msg = new byte[1024]; 
     server_conn.BeginReceive(chat_msg, 0, chat_msg.Length, SocketFlags.None, new AsyncCallback(Recieve), server_conn); 


    } 

Répondre

0

Vous devez utiliser le IAsyncResult retourné par les méthodes BeginXXX. IIRC, vous pouvez disposer du WaitHandle.

0

Est-ce que les clients ont vraiment besoin de savoir pourquoi le serveur a fermé la connexion (Vous semblez envoyer un message de déconnexion avec aucune information de raison de toute façon,)? Il semble que vous envoyez juste un message supplémentaire aux clients pour les déconnecter.

Vous pouvez déconnecter simplement tous les clients, et ils recive un message de prise à proximité, cette volonté du côté client montrent la connexion étant fermée.

Sur une note de côté, il est inutile de convertir la chaîne recived tant de fois, convertir une fois de tableau d'octets à chaîne et votre fait :).

Personnellement, l'ordre que je le ferais est:
1) Définir un bool global, que nous n'acceptons plus de nouveaux clients (IE si un nouveau client tente de se connecter à cette fois-ci, je ne l'accepte pas)
2) Aller sur la liste des clients et les déconnecter un
3) Arrêter downt il listeuse.