none
Socket: Mon client se ferme après connexion au serveur RRS feed

  • Question

  • Salut!!!

    J'ai commencé depuis un certain temps à m'interesser à la communication reseau entre applications.

    Pour cela j'utilise la classe Socket de .Net....

    Mais je comprends pas pourquoi mon client se ferme juste après sa connexion au serveur?

    J'ai le message suivant coté serveur : "Une connexion existante a dû fermée par l'hôte distant"

    AU SECOURS!!!

    Code connexion coté client:

    public void ConnectToServer(string ServerName)

        {

            if (this.SocketClient == null || !this.SocketClient.Connected)

            {

                this.SocketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

     

                IPAddress[] ipadress;

                //On récupere les informations du serveur (son nom puis son adresse IP)

                IPHostEntry he = Dns.GetHostByName(ServerName);

                ipadress = he.AddressList;

     

                this.SocketClient.BeginConnect(new IPEndPoint(ipadress[0], 1001), new AsyncCallback(ConnectCallback), null);

            }

            else

            {

                //on affiche un message

                MessageBox.Show("Déjà connecté à un serveur");

            }

     

        }

     

         /// Fonction de rappel pour la connection

        /// <param name="asyncResult">un objet IAsyncResult</param>

        private void ConnectCallback(IAsyncResult asyncResult)

        {

            try

            {

                //on récupere le socket sur lequel la connexion doit avoir lieu

                Socket socket = (Socket)asyncResult.AsyncState;

                //On affect SocketClient au socket de connection

                this.SocketClient = socket;

                //on met fin à la demande de connection

                socket.EndConnect(asyncResult);

     

                //on affiche un message

                DisplayMessage("Connecté à un serveur");

                this.LocalsocketClientIsShutingDown = false;

     

                // On initie une lecture

                this.SocketClient.BeginReceive(this.readbuf, 0, this.readbuf.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);

            }

            catch (SocketException ex)

            {

                DisplayMessage(ex.Message);

            }

        }

    mardi 30 novembre 2010 13:49

Réponses

Toutes les réponses

  • Bonjour,

    Mais je comprends pas pourquoi mon client se ferme juste après sa connexion au serveur?
    Tout simplement parceque votre serveur a fermé la connexion de son côté lors que vous faites un BeginReceive().

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    mardi 30 novembre 2010 20:22
    Modérateur
  • Bonjour,

    Mais pourquoi alors le serveur fermerait la connexion alors que le client venait à peine de se connecter????
    Pouvez-vous nous donner le code côté serveur ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    mercredi 1 décembre 2010 19:43
    Modérateur
  • Mais pourquoi alors le serveur fermerait la connexion alors que le client venait à peine de se connecter????

    C'est le BeginReceive qui pose problème? Le quel? Ou alors avez vous une bonne marche à suivre pour l'utilisation d'une Socket?

    CODE DU SERVEUR ( c'est celui que j'avais mis là dessus...)

    public void RunServer()

            {

                // Création socket serveur.

                this.SocketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

     

                IPAddress[] ipadress;

                //On récupere les informations de l'ordinateur (son nom puis son adresse IP)

                IPHostEntry he = Dns.GetHostByName(Dns.GetHostName());

                ipadress = he.AddressList;

     

                //On lance l'écoute sur le port voulu

                this.SocketServer.Bind(new IPEndPoint(ipadress[0], 1001));

                //On spécifie le nombre de connexion en attente maximun ici 1

                this.SocketServer.Listen(100);

     

                //On se met en attente de la connection d'un client 

                this.SocketServer.BeginAccept(new AsyncCallback(ConnectionAcceptCallback), this.SocketServer);

     

            }

     

            private void ConnectionAcceptCallback(IAsyncResult asyncResult)

            {

                try

                {

                    //On récupere le socket qui possede la connection

                    Socket socket = (Socket)asyncResult.AsyncState;

     

                    // Si le handle est à -1 --> La socket Serveur a été fermée.

                    if (socket.Handle.ToInt32() != -1)

                    {

                        //on accepte la connection

                        this.SocketClient = socket.EndAccept(asyncResult);

                        this.LocalsocketClientIsShutingDown = false;

                        MessageBox.Show("Un client s'est connecté");

                       //On se met en attente d'un message

                        this.SocketClient.BeginReceive(this.readbuf, 0, this.readbuf.Length, SocketFlags.None, new AsyncCallback(ReceiveMessageCallback), this.SocketClient);

                    }

                }

                catch (SocketException ex)

                {

                    MessageBox.Show(ex.Message);

                }

     

            }

    vendredi 3 décembre 2010 16:10
  • Bonjour,

     

    Avez-vous essayé d’implémenter l’exemple de la page MSDN

    Comment : utiliser les sockets  pour mieux comprendre le mécanisme ?

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

     
    Suivez MSDN sur Twitter 

    • Marqué comme réponse NMBodrick vendredi 29 avril 2011 23:37
    vendredi 10 décembre 2010 12:44
  • Bonjour,

    Vérifier l'adresse IP sur lequel vous faites le Bind() et le Connect().
    En utilisant GetHostByName() côté serveur avec GetHostName(), vous allez obtenir les adresses IP des cartes réseaux (192.XXXXXXX par exemple). En revanche côté client si vous faites un GetHostByName() avec "localhost" en paramètre, vous allez obtenir l'adresse IP de la boucle locale (127.0.0.1), ce qui ne fonctionnera pas... Spécifiez donc le nom NETBIOS de votre machine en paramètre à GetHostByName() côté client.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    • Marqué comme réponse NMBodrick mardi 21 décembre 2010 14:23
    dimanche 12 décembre 2010 13:43
    Modérateur
  • Bonjour,

     

    Federer243, est-ce que ces derniers conseils vous ont aidé à progresser ? je vous remercie de nous tenir au courant avec l’état de votre projet.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    mardi 14 décembre 2010 09:51
  • Merci pour le lien!!!

    Dans l'ensemble, je maitrise petit à petit la technologie de Socket... J'aimerai plutard communiquer parfaitement avec les clients connectés, envoyer une commande à tel ou tel autre client, recuperer son son adresse IP par exemple,...

    Merci pour ton aide. :-)

    lundi 20 décembre 2010 15:00
  • Bonjour!!!

    J'utilise une variale pour le nom du serveur  

    IPHostEntry he = Dns.GetHostByName(ServerName);

    // ServerName recupère le contenu du textBox...

    J'arrive quand même à me connecter au serveur et j'aimerai aller plus loin dans cette techn ologie....

    Merci

     

    lundi 20 décembre 2010 15:10
  • Bonjour,

    Pouvez-vous nous dire si ma réponse répond à votre problème ? Si vous avez de nouveau un autre problème, merci de créer une nouvelle discussion.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    lundi 20 décembre 2010 20:14
    Modérateur