IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

question utilisation socket


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut question utilisation socket
    Bonjour,

    Je débute avec le C# et je développe actuellement une application qui consiste à récupérer les données d'un capteur qui sont transmises via une liaison Ethernet (protocole tcp/ip utilisé). Afin de les récupérer j'ai pensé utiliser un socket. Mon premier problème est de savoir si je dois travailler avec le socket en temps que serveur ou client.

    Pour l'instant j'ai codé ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Socket serveursockets = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     
            IPEndPoint pointdeter = new IPEndPoint(IPAddress.Parse("192.168.4.5"), 8000);
    Je pensais ensuite utiliser la méthode bind et listen afin de déclencher l'écoute.

    Pouvez-vous m'éclairer sur la façon dont je dois utiliser les sockets afin de récupérer les données?

    Merci d'avance pour vos réponses et au temps que vous m'aurez consacré

  2. #2
    Invité
    Invité(e)
    Par défaut
    Si ton capteur initie une connexion, tu devras effectivement créer une socket de type serveur (bind + listen).
    Tu pourrais peut-être te tourner vers WCF qui permet de faire pas mal de choses de manière simple, une fois la documentation assimilée

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Merci de ta réponse. En fait mon capteur est géré par un microcontroleur qui lui même gère un module Ethernet qui se charge d'envoyer les données vers le pc. J'ai déjà su faire passer des page html via ce même module donc je suppose qu'une connexion est initiée. Je vais continuer à creuser du coté des sockets

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    il faudrait voir la doc que ton capteur, mais en général un capteur est le serveur, et il te faudrait donc un client

    la classe socket est la classe de base, il y a la classe TcpClient qui est légèrement plus simple à utiliser, mais qui peut rester complexe quand même ^^
    client.connect
    client.read
    (client.write pour envoyer)
    client.close
    (et client.dispose peut etre)
    le tout dans un thread, ou alors comprendre les fonctions asynchrones

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Effectivement après vérification de la doc mon module Ethernet agit comme serveur. Le socket devra donc etre en client. J'ai vu pas mal de chose sur les threads sur le site je vais donc tester cette voie la

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    j'amerai essayer d'utiliser la methode client.connect , mais il me demande de creer un endpoint pour le moment je fais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            public void button1_Click(object sender, EventArgs e)
            {
     
     
              clientsockets.Connect(,8000);  
     
            }
    je ne sais pas du tout comment créer mon argument manquant , sauriez vous m'aider ??

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    il faut utiliser l'intellisense, pour voir les différentes surcharges
    ensuite pour les paramètre si ca demande un endpoint, bah tu fais un new endpoint et tu regardes ce que ca demande etc...
    sinon y a f1 qui te permet de voir le détail sur les classes et membres du framework

  8. #8
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par leraleur22 Voir le message
    j'amerai essayer d'utiliser la methode client.connect , mais il me demande de creer un endpoint pour le moment je fais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            public void button1_Click(object sender, EventArgs e)
            {
     
     
              clientsockets.Connect(,8000);  
     
            }
    je ne sais pas du tout comment créer mon argument manquant , sauriez vous m'aider ??
    Connect est surchargé => http://msdn.microsoft.com/en-us/libr...ts.socket.aspx

    Tu peux écrire cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const string host = "localhost";
    const int port = 5000;
     
    clientSocket.Connect(host,port);
    Sinon le code que tu as mis dans ton premier post est un bon départ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const int port = 5000;
    clientSocket.Connect( new IPEndPoint(IPAddress.Parse("192.168.4.5"), port);

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    comment faire en sorte que le port soit lu en permanence ?

  10. #10
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par leraleur22 Voir le message
    comment faire en sorte que le port soit lu en permanence ?
    Le port en principe il est défini une fois et il ne change pas tout le temps. (autant dire que pour un équipement il ne change 90% du temps jamais (le cas où cela peut changer c'est lorsque l'équipement est derrière une passerelle par exemple). Auquel cas il faut le définir dans un fichier de configuration mais bon un équipement ne viendra pas écrire dedans automatiquement pour te dire qu'il a changé de port (c'est une opération manuelle que ton programme peut lire automatiquement)

    C'est quoi le protocole de communication de ton équipement ? C'est un protocole normalisé ou pas ?

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    le protocole est le TCP/ip , mais j'aimerai que le port soit lu en continu (rafraichissement des données tout les x temps)

    les donnée sont transmisse pas un microcontrolleur (ce sont des donnée de température envoyées sous forme de chaîne de caractère)

    mais je ne connais pas du tout comment lire le port ... ca serai bien que l'on m'explique avec des exemple de code ( sans utiliser de dns )

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            public void button1_Click(object sender, EventArgs e)
            {
     
            IPAddress  ipa = new IPAddress(thom);// 143.24.20.36
            clientsockets.Connect(ipa,8000);
     
            }
    voici le code pour la connexion je ne sais meme pas s'il est bon car ca na communique pas

  13. #13
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par leraleur22 Voir le message
    le protocole est le TCP/ip , mais j'aimerai que le port soit lu en continu (rafraichissement des données tout les x temps)

    les donnée sont transmisse pas un microcontrolleur (ce sont des donnée de température envoyées sous forme de chaîne de caractère)
    En fait je parlais de la couche applicative. Est-ce qu'il s'agit d'un protocole modbus ? Ftp ? Http ? SMTP ??? Manifestement c'est rien de tout cela puisque c'est sous forme brute chaîne de caractère.(une espèce de protocole batard ?)

    Il faut distinguer la lecture des données de la lecture d'un port car cela ne veut absolument pas dire la même chose. Pour lire de manière périodique il faut utiliser un timer, un thread ou une task et dans le code de ce timer|thread|task il suffit de faire un appel à la méthode Read de ta socket (encore mieux est de s'abonner à l'événement DataReceived)

    Citation Envoyé par leraleur22 Voir le message
    mais je ne connais pas du tout comment lire le port ... ca serai bien que l'on m'explique avec des exemple de code ( sans utiliser de dns )
    Mais tu n'as pas à lire le port (d'ailleurs tu ne le peux pas dans 90% des cas) il faut le connaître à l'avance pour communiquer avec ton équipement en le définissant dans un fichier de configuration. Ce que tu veux lire ce sont les données de l'équipement qui se trouve à une adresse et qui utilise un port.

    Tu dis que cela ne marche pas mais quelle est ton erreur ???
    Es-tu sûr que ton équipement se trouve sur l'adresse et le port que tu utilises ???

  14. #14
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par leraleur22 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            public void button1_Click(object sender, EventArgs e)
            {
     
            IPAddress  ipa = new IPAddress(thom);// 143.24.20.36
            clientsockets.Connect(ipa,8000);
     
            }
    voici le code pour la connexion je ne sais meme pas s'il est bon car ca na communique pas
    Ici tu ne fais qu'une tentative de connexion à aucun moment cela lit les données. La question est déjà est-ce que l'appel à Connect marche où est-ce que tu as une erreur et si oui quelle est telle ?

  15. #15
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    lance un thread pour le tcp/ip, car les méthodes simples sont bloquantes

    dans le principe, un thread pour lire sur le réseau et stocker ce que tu récupères
    un timer qui s'occupe d'afficher la valeur récupérée (500ms par exemple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    public class Form1
    {
     
        private System.DateTime last_date_capteur_ok;
            // à typer selon ce que tu récupères
        private object valeur_capteur;
     
        public Form1()
        {
            initializecomponent();
            thread th = new thread(lectureCapteur);
            th.isbackground = true;
            th.start();
            timer1.Start();
        }
     
     
        private void lectureCapteur()
        {
            // connection socket
            while (true) {
                tcp.read();
                last_date_capteur_ok = DateAndTime.Now;
                valeur_vapteur = valeur_trouvée;
            }
        }
     
     
        public void timer1_tick(object sender, voir_ce_qu_il_faut e)
        {
            if (last_date_capteur_ok.AddSeconds(2) < DateAndTime.Now)
                afficher_que_ca_répond_plus();
            this.label1.text = valeur_capteur.ToString();
        }
     
    }
    le code est pas totalement fini, il faut gérer la perte de connexion et la reconnexion par exemple, l'arrêt propre du thread, ou encore mettre des try/catch
    si tu as plusieurs capteurs il faut faire une classe pour ranger un peu mieux

  16. #16
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    j'ai etabli la connexion , mais il ne veux pas lire .....

    voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     public partial class Form1 : Form
        {
            Socket clientsockets = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            SocketAddress adresse = new SocketAddress(AddressFamily.InterNetwork);
            long thom = 0X2414188f;
     
            public Form1()
            {
                InitializeComponent();
     
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
     
            }
     
            public static void threadloop ()
            {
     
                while (Thread.CurrentThread.IsAlive)// tant que le threads est encore en vie 
                { 
     
     
                }
     
            }
     
            public void button1_Click(object sender, EventArgs e)
            {
     
            IPAddress ipa = new IPAddress(thom);// 143.24.20.36
            clientsockets.Connect(ipa, 8000);
            Thread nico = new Thread(new ThreadStart(threadloop));
            nico.IsBackground = true;// thread d'arrière plan
            nico.Start();// lancement du threads 
     
            }

    il ne connait pas tcp.read();

  17. #17
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    finalement il ne fait meme pas la connexion car il ne se connecte pas au pic

  18. #18
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par leraleur22 Voir le message
    j'ai etabli la connexion

    C'est bien c'est la première chose qu'il faut faire. Auquel cas il faut connaître le message d'erreur de la connexion pour faire un diagnostic. Pour cela il suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try
    {
       clientSocket.Connect(...);
    }
    catch(Exception ex)
    {
       //ex.Message te donne la raison de l'échec.
    }
    Citation Envoyé par leraleur22 Voir le message
    il ne connait pas tcp.read();
    Oui regarde le lien vers la documentation que je t'ai donné il y a toutes les méthodes disponibles. En fait il faut que tu utilises la méthode Receive qui est surchargée.

    http://msdn.microsoft.com/en-us/library/8s4y8aff.aspx

  19. #19
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    oui j'ai écrit read pour dire que tu dois lire, pour trouver l'instruction exacte et le reste du code, il va bien falloir finir par lire une doc sur les sockets en .net
    car le net regorge de cours et tutos sur l'utilisation des sockets en c#, et en plus ca gagne du temps

  20. #20
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    De plus il va falloir que ta socket soit déclarée en static car tu l'a créé dans le thread de ton IHM et tu veux l'utiliser dans un autre thread créé par tes soins hors le contexte de 2 threads différents (la zone mémoire où sont les variables notamment) sont différents (d'où l'utilisation d'une socket en static pour la partager entre thread, bien que d'un point de vue conception ta façon de faire va te poser d'autres problèmes et nuire à la lisibilité et la maintenance)

Discussions similaires

  1. Question sur Socket!
    Par kurtiss dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 26/07/2007, 20h51
  2. question sur socket.h linux
    Par doommick31 dans le forum Réseau
    Réponses: 8
    Dernier message: 25/05/2007, 08h11
  3. Réponses: 2
    Dernier message: 18/04/2007, 11h55
  4. [REGEXP] Question Utilisation fonction replace
    Par calitom dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/03/2007, 17h39
  5. Question Utilisation cpu
    Par devdev2003 dans le forum Administration système
    Réponses: 4
    Dernier message: 03/12/2005, 17h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo