2010-02-28 5 views
1

Je ne parviens pas à connecter un client simple et un serveur simple. Lorsque je lance le serveur, il ne semble pas y avoir de problème, mais quand j'essaie de lui envoyer des données avec le client, il émet une exception disant qu'il ne s'est pas connecté dans un délai d'attente.Les sockets dans .NET ne sont pas connectées

Voici le code du serveur J'utilise:

public void server() 
    { 
     try 
     { 
      byte[] bytes = new byte[1024]; 
      int bytesReceived = 0; 
      String message = ""; 
      IPAddress direction = IPAddress.Parse(getIPExternal()); //getIPExternal return the public IP of the machine in which the programm runs 
      IPEndPoint directionPort = new IPEndPoint(direction, 5656); 
      Socket socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      socketServer.Bind(directionPort); 
      socketServer.Listen(100); 
      while (true) 
      { 
       Socket client = socketServer.Accept(); 
       bytesReceived = client.Receive(bytes); 
       message = System.Text.Encoding.Unicode.GetString(bytes, 0, bytesReceived); 

       editMultiline.Invoke(new writeMessageDelegate(writeMessage), new object[] { message, "client"}); //Ignore this, it is just to show the info in a textbox because the server code runs in a diferent thread 

       client.Shutdown(SocketShutdown.Both); 
       client.Close(); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Server error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

De cette façon, je reçois l'adresse IP publique de la machine sur laquelle le programme fonctionne:

public string getIPExternal() 
    { 
     string direction; 
     WebRequest request = WebRequest.Create("http://checkip.dyndns.org/"); 
     WebResponse response = request.GetResponse(); 
     StreamReader stream = new StreamReader(response.GetResponseStream()); 
     direction = stream.ReadToEnd(); 
     stream.Close(); 
     response.Close(); 

     //Search for the ip in the html 
     int first = direction.IndexOf("Address: ") + 9; 
     int last = direction.LastIndexOf("</body>"); 
     direction = direction.Substring(first, last - first); 

     return direction; 
    } 

Et voici mon code client :

public void client(string directionIP, string message) //directionIP is the IP from the computer to which i want to get connected 
    { 
     try 
     { 
      byte[] bytesSend = System.Text.Encoding.Unicode.GetBytes(message); 
      IPAddress direction = IPAddress.Parse(directionIP); 
      IPEndPoint directionPort = new IPEndPoint(direction, 5656); 
      Socket socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      socketClient.Connect(directionPort); 
      socketClient.Send(bytesSend); 
      socketClient.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Client error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

Toute suggestion serait géniale.

+1

où exactement l'exception est-elle levée? – caesay

+3

Je vous invite à cesser d'afficher ex.Message. Utilisez ex.ToString() à la place. –

+1

@ezgar, j'ai déjà répondu mais je l'ai supprimé après avoir testé vos codes car il s'agissait d'un problème différent. Comme sniperX l'a demandé, où exactement l'exception est-elle levée et quel est le message d'exception? Je n'ai pas pu reproduire une erreur similaire car mon installation n'a pas d'adresse IP publique que je récupère avec 'dyndns.org'. –

Répondre

1

Id suggère à la recherche dans la classe TcpListener et TcpClient, au lieu de jouer avec des prises .. la Tcp * classe de faire tout ce genre de choses pour vous

+0

Ok, je vais les vérifier. – ezgar

1

Obtenir l'adresse IP publique implique que vous êtes derrière un dispositif NAT (comme un routeur domestique simple). Vous êtes-vous assuré que le périphérique transfère les connexions TCP au port 5656 vers le serveur et que le pare-feu du serveur a également été configuré?

+0

Oui, je l'ai fait. – ezgar

1

Veuillez essayer ce code. Peut-être sans les fuites de ressources, il fonctionnera mieux:

public void server() 
{ 
    try 
    { 
     byte[] bytes = new byte[1024]; 
     IPAddress direction = IPAddress.Parse(getIPExternal()); //getIPExternal return the public IP of the machine in which the programm runs 
     IPEndPoint directionPort = new IPEndPoint(direction, 5656); 
     using (Socket socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) 
     { 
      socketServer.Bind(directionPort); 
      socketServer.Listen(100); 
      while (true) 
      { 
       using (Socket client = socketServer.Accept()) 
       { 
        int bytesReceived = client.Receive(bytes); 
        String message = System.Text.Encoding.Unicode.GetString(bytes, 0, bytesReceived); 

        editMultiline.Invoke(new writeMessageDelegate(writeMessage), new object[] { message, "client" }); //Ignore this, it is just to show the info in a textbox because the server code runs in a diferent thread 

        client.Shutdown(SocketShutdown.Both); 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString(), "Server error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
} 

public string getIPExternal() 
{ 
    WebRequest request = WebRequest.Create("http://checkip.dyndns.org/"); 
    string direction; 
    using (WebResponse response = request.GetResponse()) 
    { 
     using (Stream responseStream = response.GetResponseStream()) 
     { 
      using (StreamReader reader = new StreamReader(responseStream)) 
      { 
       direction = reader.ReadToEnd(); 
      } 
     } 
    } 

    //Search for the ip in the html 
    int first = direction.IndexOf("Address: ") + 9; 
    int last = direction.LastIndexOf("</body>"); 
    return direction.Substring(first, last - first); 
} 

abd le client:

public void client(string directionIP, string message) //directionIP is the IP from the computer to which i want to get connected 
{ 
    try 
    { 
     byte[] bytesSend = System.Text.Encoding.Unicode.GetBytes(message); 
     IPAddress direction = IPAddress.Parse(directionIP); 
     IPEndPoint directionPort = new IPEndPoint(direction, 5656); 
     using (Socket socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) 
     { 
      socketClient.Connect(directionPort); 
      socketClient.Send(bytesSend); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString(), "Client error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
} 
+0

Ok, je vais vérifier votre code; Merci. – ezgar

1

Il y a beaucoup de place pour l'échec ici. Les chances que le client puisse deviner l'adresse IP du serveur sont minces, sauf si vous le saisissez à la main. Il devrait également fonctionner sur un autre réseau. Pensez à utiliser l'adresse IP locale si vous testez ceci avec deux machines proches, 127.0.0.1 si vous testez sur la même machine. Et le numéro de port est presque certainement bloqué par votre pare-feu. Vous devrez faire une exception explicite pour cela.

+0

Oui, l'adresse IP du serveur est introduite par l'utilisateur dans une zone de texte; et j'ai désactivé le pare-feu. – ezgar

+0

Alors, combien de machines utilisez-vous, à quoi ressemble le réseau, et avez-vous essayé 127.0.0.1? Le reste de ma réponse compte aussi. –

Questions connexes