2011-10-18 15 views
0

Je suis fatigué de trouver quel est le problème avec mon code ... S'il vous plaît aidez-moi ici! J'essaie de créer une connexion TCP entre le client du serveur dans le réseau local. Ce qui se passe, c'est que le programme se bloque lorsque le client essaie de se connecter. S'il vous plaît voir le code:La connexion TCP a échoué

public void Go() 
     { 
      if (whatjob == true) 
      { 
       IPEndPoint server_ipEndPoint = new IPEndPoint(IPAddress.Any, PortNum); 
       server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
       server_socket.Bind(server_ipEndPoint); 
       try 
       { 

        server_socket.Listen(1); 
        server_GotClient = server_socket.Accept(); 
       } 
       catch (SocketException e) 
       { 
        MessageBox.Show("Unable to listen..."); 
        MessageBox.Show(e.ToString()); 
       } 


       reading = new Thread(new ThreadStart(this.get_msg)); 
       reading.Start(); 
      } 

      if (whatjob == false) 
      { 
       IPEndPoint client_ipEndPoint = new IPEndPoint(IPAddress.Parse(IpAddress), PortNum); 
       client_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
       try 
       { 
        client_socket.Blocking = true; 
        client_socket.Connect(client_ipEndPoint); //here it stops execution 
        //client_socket.BeginConnect(client_ipEndPoint, new AsyncCallback(NowConnected), client_socket); 
       } 
       catch (SocketException e) 
       { 
        MessageBox.Show("Unable to connect..."); 
        MessageBox.Show(e.ToString()); 
        return; 
       } 
       reading = new Thread(new ThreadStart(this.get_msg)); 
       reading.Start(); 
      } 

Quoititre est bool ... vrai moyen de faire des moyens travail serveur et faux faire le travail client

cette fonction est à l'intérieur des fenêtres formulaire pour la fenêtre de chat. quand il atteint jusqu'à client_socket.connect (IPEndPoint), il est écrasé et même la fenêtre de chat est deformated ...

Fonction filetée

public void get_msg() 
     { 
      byte[] byte_message = new byte[1000]; 
      string string_message = null; 
      int x = 0; 
      while (true) 
      { 
       if (server_GotClient != null) 
       { 
        x = server_GotClient.Receive(byte_message); 
       } 
       if (client_socket != null) 
       { 
        x = client_socket.Receive(byte_message); 
       } 

       if (x != 0) 
       { 
        string_message = Encoding.ASCII.GetString(byte_message); 
        this.richTextBox_GetMessage.Invoke(new MethodInvoker(delegate 
        { 
         richTextBox_GetMessage.Text = richTextBox_GetMessage.Text + "\nFriend: " + string_message; 

        })); 
       } 
       x = 0; 
      } 
      server_socket.Close(); 
     } 

S'il vous plaît aider au sujet de ce code. pour ajouter plus loin, je n'ai aucune connaissance des techniques asynchrones, aidez-moi avec quelques méthodes faciles.

+1

Quelle était l'exception? –

Répondre

2

Il serait utile de connaître le message d'erreur complet. D'après ce que vous avez montré, je pense que l'exception lancée n'est pas une exception SocketException. Les documents MSDN pour Socket.Connect montrent qu'il peut déclencher l'une des quatre exceptions, y compris SocketException.

Je voudrais changer le type d'exception dans la capture à juste une exception, et définir mon point d'arrêt sur le crochet d'ouverture. La prochaine fois que cela échouera, vous saurez exactement ce qui ne va pas, et vous pourrez l'attraper et le gérer à partir de là.

En outre, je remarque que même si votre travail client renvoie cette méthode sur une erreur de connexion, le travail sur le serveur ne renvoie pas; l'exception est interceptée, les messages s'affichent, puis l'exécution se poursuit avec reading = new Thread(new ThreadStart(this.get_msg));. Cela entraînera probablement des exceptions supplémentaires, dont vous ne vous attendez pas, à être rejetées. Sauf si vous êtes sûr que c'est le flux de travail du client qui échoue ici, je ferais attention à l'autre côté de cette méthode. En ce qui concerne l'aide multithread, il existe de nombreuses ressources, y compris d'autres questions sur SO, qui peuvent vous aider à démarrer. Vous ne savez pas exactement ce que vous voulez faire en multithread, et comment vous devez être capable de le contrôler, donc toute réponse que j'essaie de donner aurait probablement des erreurs qui vous frustreraient davantage parce que ce n'était pas la bonne approche.

+0

Merci, votre conseil était l'aide complète. J'ai trouvé que ce n'était pas vraiment le problème de création de connexion ... Mais c'est le thread ... En fait, j'exécute cette fonction dans un évènement généré sur FORM LOAD. Je pense, j'ai besoin de trouver une autre méthode pour exécuter cette fonction ... Avez-vous une idée? –

+1

Fondamentalement, vous devez refactoriser le gestionnaire d'événements pour mettre tous les soutiens lourds dans une méthode. Ensuite, donnez cette méthode à une construction de threads que vous lancerez à partir du gestionnaire; il y a un objet Thread, le ThreadPool, Delegate.BeginInvoke, le composant BackgroundWorker, etc etc. Comme je l'ai dit, plusieurs façons de le configurer, dont l'une sera probablement la "meilleure". – KeithS

+0

Merci pour toutes les informations ... –

Questions connexes