none
Problème de reconnexion à un socket RRS feed

  • Question

  • Bonjour,

    En ce moment je crée une application en c# qui doit se connecter à un équipement électronique via Wifi qui utilise l'adresse IP :  169.254.1.1 port TCP : 2000.  
    Dans cette application c# je doit pouvoir me connecter pour pouvoir faire la configuration puis me déconnecter pour pouvoir l'utiliser avec d'autres équipements et ensuite pourvoir me reconnecter pour des éventuels modifications.

    Mon code est le suivant :

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Net;
    using System.Net.Sockets;
    using System.Diagnostics;
    
    namespace test
    {
        public partial class Wifi : Form
        {
    
            public Wifi()
            {
                InitializeComponent();
                Ecrire.Visible = false;
    
            }
    
            Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
            private void Connexion_Click(object sender, EventArgs e)
            {
                IPEndPoint IP = new IPEndPoint(IPAddress.Parse("169.254.1.1"), 2000);
    
                try
                {
                    sck.Connect(IP);
    
                    Connexion.Text = "Connecté";
                    Connexion.BackColor = Color.ForestGreen;
                    Ecrire.Visible = true;
    
                }
                catch (SocketException)
                {
                    sck.Shutdown(SocketShutdown.Both);
                    //sck.Disconnect(true);
                    //sck.Close();
    
                    MessageBox.Show("Connectez vous");
    
                    Connexion.Text = "Déconnecté";
                    Connexion.BackColor = Color.Red;
    return;
                }
    
            }
    }
    }

    Mon problème c'est que je n'arrive pas à me reconnecter. J'ai utilisé les fonctions Shutdown, Disconnect et Close mais sans succès.

    Message d'erreur  :
    " Une exception de première chance de type 'System.InvalidOperationException' s'est produite dans System.dll

    Informations supplémentaires : Une fois le socket déconnecté, vous pouvez uniquement le reconnecter de manière asynchrone, et sur un point de terminaison (EndPoint) différent. BeginConnect doit être appelé sur un thread qui ne fermera pas tant que l'opération n'a pas été menée à terme. "

    Merci d'avance de m'aider.


    • Modifié luso22 mardi 20 janvier 2015 08:19
    lundi 19 janvier 2015 10:15

Réponses

  • Bonjour,

    Personnellement, quand j'utilise une connexion TCP, je préfère utiliser la classe TcpClient qui est beaucoup plus simple que la manipulation de Socket. N'hésite pas à consulter la documentation de la classe avec les exemples notamment.

    Après, si tu tiens à garder absolument la classe Socket, je pense qu'il faudrait alors déclarer une nouvelle instance si tu veux faire une reconnexion...


    Philippe


    lundi 19 janvier 2015 12:08
  • En fait, avec la classe TcpClient, le plus simple est d'utiliser le flux de type NetworkStream renvoyé par la méthode GetStream. Quand tu vas sur la documentation de la classe TcpClient, il y a tout un exemple qui utilise le NetworkStream. Quand tu veux envoyer des informations, tu utilises la méthode "Write" du Stream et quand tu t'attends à recevoir des informations, tu utilises la méthode "Read".


    Philippe

    mardi 20 janvier 2015 08:37

Toutes les réponses

  • Bonjour,

    Personnellement, quand j'utilise une connexion TCP, je préfère utiliser la classe TcpClient qui est beaucoup plus simple que la manipulation de Socket. N'hésite pas à consulter la documentation de la classe avec les exemples notamment.

    Après, si tu tiens à garder absolument la classe Socket, je pense qu'il faudrait alors déclarer une nouvelle instance si tu veux faire une reconnexion...


    Philippe


    lundi 19 janvier 2015 12:08
  • Bonjour, 

    Je me suis un peu documenté sur la classe TcpClient mais je ne vois pas vraiment comment faire pour envoyer et recevoir des informations ... Avec la classe Socket j'ai à disposition les fonctions Send et Receive que j'utilise comme cela :

    string msg = "r1"; byte[] msgBuffer = Encoding.Default.GetBytes(msg); sck.Send(msgBuffer, 0, msgBuffer.Length, 0);

    byte[] buffer1 = new byte[255];

    int rec = sck.Receive(bufferRX1, 0, bufferRX1.Length, 0); Array.Resize(ref bufferRX1, rec); string tab = Encoding.Default.GetString(bufferRX1).ToString();

    Y a t'il un équivalent pour ces fonctions avec la classe TcpClient ? Pourriez vous me donner un exemple de code s'il vous plait.

    Pedro


    • Modifié luso22 mardi 20 janvier 2015 08:32
    mardi 20 janvier 2015 08:31
  • En fait, avec la classe TcpClient, le plus simple est d'utiliser le flux de type NetworkStream renvoyé par la méthode GetStream. Quand tu vas sur la documentation de la classe TcpClient, il y a tout un exemple qui utilise le NetworkStream. Quand tu veux envoyer des informations, tu utilises la méthode "Write" du Stream et quand tu t'attends à recevoir des informations, tu utilises la méthode "Read".


    Philippe

    mardi 20 janvier 2015 08:37