Socket...Comprend pas !!

Signaler
Messages postés
39
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
24 avril 2014
-
Messages postés
39
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
24 avril 2014
-
Bonjour a tous.
D'ici quelques mois, je vais devoir faire mon projet final d'école qui touchera la domotique. Une partie de mon projet sera d'aller voir des données et/ou modifier des données (si tout va bien) qui seront sur un pic.
J'ai trouvé un PCB ethernet->uart->pic qui intègre une adresse ip, masque et tout ce qui faut pour pouvoir y accéder sur un réseau.
Pour ce faire, on m'a fortement conseillé d'apprendre le Csharp...
Donc je m'y mets pour ne pas manquer de temps, mais je suis face a un gros problème: les sockets. J'ai lu, j'ai cherché, mais j'ai beaucoup de difficulté à comprendre.

Donc je voudrais savoir, pour un réseau local, si je connais les adresses ip de touts les périphériques ainsi que les masques, est ce qu'il y à une fonction dans les sockets qui me permet une communication simple.
exemple(j'invente): pc1 192.168.1.3 /24 pc2 192.168.1.4 /24
Sur le pc1:
SendTo( message , 192.168.1.4)

Sur le pc2:
textBox1.Text = ReceiveFrom( message);

Dans mes recherches, j'ai rien trouvé de telle. Mais c'est ton jamais.
Merci de votre aide
Grégory
A voir également:

19 réponses

Messages postés
792
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2019
8
Bonjour,
je crois tu n'as pas trop insisté dans tes recherches. Je sus sûr qu'il y a des projets sur ce site.

ou celui de code project :
http://www.codeproject.com/KB/IP/chandrasekar.aspx
Il y a aussi cet excellent article :
http://morpheus.developpez.com/reseaucsharp/

louis
Messages postés
39
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
24 avril 2014

Salut Louis

Merci pour les liens.
En effet, il existe plein de projet ou du tutoriel sur les sockets, seulement pour un novice, cela est du charabia.

C'est pour cela que j'ai demandé de l'aide avec un exemple simple pour que l'on puisse m'apporter une solution plus spécifique qu'une page complète de code ( même si elle son expliqué) qu'un débutant ne comprendra pas.

Je vais lire ton lien et je te reviendrais avec des questions spécifiques sur ce que je n'ai pas compris.
Merci de ton aide
Grégory
Messages postés
39
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
24 avril 2014

Allo Louis

Donc je suis pris sur le tuto http://morpheus.developpez.com/reseaucsharp/ au point 2.2. J'ai un message d'erreur et je ne trouve pas la solution.
Je te met le peu que j'ai fais pour que tu puisses voir la progression et le problème.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;



namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        
        private void button1_Click(object sender, EventArgs e)
        { // bouton connection
            
        _socket.Connect(new IpEndPoint(IpDestination,80));
            
        }

        private void button2_Click(object sender, EventArgs e)
        {// bouton déconnection

        }

        private void button3_Click(object sender, EventArgs e)
        {// bouton envoyer

        }
        
    }
}


L'erreur est:

Erreur 1 Le type ou le nom d'espace de noms 'IpEndPoint' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?) C:\Users\Gregory\Desktop\Tchat\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 28 33 WindowsFormsApplication1

Voila c'est tout pour l'instant. Si tu as des recommandations a me faire, je t'écoute.
Merci
Grégory
Messages postés
792
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2019
8
Bonjour,
je voius que tu fais bien using System.net dans lequel est défini IpEndpoint, Mais as-tu ajouté la référence à ton projet?


louis
Messages postés
792
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2019
8
Bonjour,
Voilà un projet plus complet avec plus d'options et les explications snt bonnes :
http://www.codeproject.com/KB/IP/TCPServClntCommRMIFrmwrk.aspx.

Bon codage
louis
Messages postés
39
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
24 avril 2014

Salut Louis
Malheureusement je n'ai toujours pas compris d'ou venait mon erreur, est ce que tu pourrais m'aider...
Merci
Grégory
Messages postés
792
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2019
8
Bonjour,
Peux-tu me confirmer que tu as bien ajouter la référence System.Net à ton projet.
Sinon je veux bien que tu m'envoies ton projet afin que j'essaie de le compiler.


louis
Messages postés
39
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
24 avril 2014

Salut Louis

J'ai bien ajouté système.net. ( clique droit sur référence->ajouter->onglet .net) Pour l'instant c'est le même code que ci-haut avec la même erreur "IpEndPoint" que je n'arrive pas a trouvé.

Merci
Grégory
Messages postés
792
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2019
8
Rebonjour,

Où est défini Ipdestination?

louis
Messages postés
792
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2019
8
Rebonjour,
peux-tu scinder la ligne en 2:

_socket.Connect(new IpEndPoint(IpDestination,80));
=>
IpEndPoint ipEP = new IpEndPoint(IpDestination,80));
_socket.Connect(ipEP);

Afin de voir d'où vient vraiment l'erreur.
As-tu vu cet article et peux-tu le compiler :
http://stephaneey.developpez.com/tutoriel/dotnet/sockets/

louis
Messages postés
39
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
24 avril 2014

Alors Voici ce que j'ai fais en suivant tes recommandations pour mon code personnel:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;



namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Socket _socket = new Socket(AddressFamily.InterNetwork,    SocketType.Stream, ProtocolType.Tcp);
        String IpDestination = "192.168.1.10";
        
        
        private void button1_Click(object sender, EventArgs e)
        { // bouton connection
            
            IpEndPoint ipEP = new IpEndPoint(IpDestination,80); 
            _socket.Connect(ipEP);
        }

        private void button2_Click(object sender, EventArgs e)
        {// bouton déconnection

        }

        private void button3_Click(object sender, EventArgs e)
        {//// bouton envoyer

        }
        
    }
}


Mais j'ai encore l'erreur:
Erreur 1 Le type ou le nom d'espace de noms 'IpEndPoint' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?) C:\Users\Gregory\Desktop\Tchat\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 30 13 WindowsFormsApplication1

Suivi de:
Erreur 2 Le type ou le nom d'espace de noms 'IpEndPoint' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?) C:\Users\Gregory\Desktop\Tchat\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 30 35 WindowsFormsApplication1

Pour le code venant de http://stephaneey.developpez.com/tutoriel/dotnet/sockets/

J'avais une 30ène d'erreur... j'ai pu en réglet pour qu'il m'en reste quelques une dont :
Erreur 1 Le programme 'C:\Users\Gregory\Desktop\Nouveau dossier\WindowsFormsApplication1\WindowsFormsApplication1\obj\x86\Debug\WindowsFormsApplication1.exe' a plusieurs points d'entrée définis : 'WindowsFormsApplication1.Program.Main()'. Compilez avec l'option /main pour spécifier le type qui contient le point d'entrée. C:\Users\Gregory\Desktop\Nouveau dossier\WindowsFormsApplication1\WindowsFormsApplication1\Program.cs 14 21 WindowsFormsApplication1

Voila ou j'en suis.
Si tu as une idée, je vais la suivre, sinon j'ai trouvé un code qui fonctionne, je vais essayé de le modifier pour l'adapter a mes besoins.

Merci
Grégory
Messages postés
792
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2019
8
Bonjour,
Bon , j'ai recréé le projet ave tes sources et voilà mes conclusions :
Le problème provient du nom IPEndpoint ( tu as une minuscule en deuxième position et la syntaxe est sensibl à la case); après cette correction tout compile normalement. J'aurais du le voir de suite , dommage.
donc copie ces lignes dans ton code et tiens-moi au courant:
//IpEndPoint ipEP = new IpEndPoint(IPAddress.Any, 80);
IPEndPoint ipEP = new IPEndPoint(IPAddress.Parse(IpDestination), 80);
_socket.Connect(ipEP);

louis
Messages postés
39
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
24 avril 2014

Bonjour

Super !!!
Je ne suis pas fermé a continué, surtout que tu as trouvé mon problème. Je vais continué mon programme et continué a te poser mes questiones.
Merci encore, c'est génial.
Grégory
Messages postés
39
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
24 avril 2014

Salut Louis

Dsl, ca prend du temps, mais avec l'école, je suis pas mal occupé.
Donc voici le code ou je suis rendu. Il n'y a pas d'erreur et j'ai suivie le indications du tuto que tu m'avais donné.
J'ai rien fait de compliqué, je veux surtout comprendre. Est-ce que pour mon code,j'ai juste besoin de cela pour envoyer un message ?
 Socket socket = new Socket(AddressFamily.InterNetwork,
        SocketType.Stream, ProtocolType.Tcp);

        String IpDestination = "192.168.1.10", EdtBox;
        Byte[] MessageAEnvoyer;
        int OctetsEnvoyes;
        
        private void button1_Click(object sender, EventArgs e)
        { // bouton connection
            
           IPEndPoint ipEP = new IPEndPoint(IPAddress.Parse(IpDestination), 80);
           socket.Connect(ipEP);
        }

        private void button2_Click(object sender, EventArgs e)
        {// bouton déconnection
            socket.Close();
        }

        private void button3_Click(object sender, EventArgs e)
        {//// bouton envoyer

            EdtBox = textBox1.Text;
            MessageAEnvoyer = System.Text.Encoding.ASCII.GetBytes(EdtBox);

            OctetsEnvoyes = socket.Send(MessageAEnvoyer, 0, 
            MessageAEnvoyer.Length, SocketFlags.None);

            textBox1.Text="";
        }    
    }



Merci
Grégory
Messages postés
792
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2019
8
Bonjour,
Normalement , cela devrait être bon si de l'autre côté tu as un serveur qui attend ton message. Du côté serveur, il te faut un sockets que tu ouvres (open, listen). Mais je pense que cela doit être dasn le tuto.
Bon codage , à toi de jouer.


louis
Messages postés
792
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2019
8
Bonjour,
Je te conseille cet autre projet pour bien comprendre :
http://www.codeproject.com/KB/IP/ChatAsynchTCPSockets.aspx
Bon codage


louis
Messages postés
39
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
24 avril 2014

Allo Louis

Je suis coincé. J'essaye de faire fonctionner mon socket client avec le lien que tu m'as donné, mais j'ai des petites questions.

Rappel : Je veux envoyer dans 1 sens des infos client_1 vers client_2.

De ce que j'ai pu lire et comprendre du lien que tu m'as envoyé, je dois mettre ceci dans client 2 aussi:

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


Ce que je ne comprend pas trop, c'est que je dois définir "IPEndPoint". J'ai cru que c'était a ajouter seulement dans client_1 pour définir la destination qui est client_2. Peux tu me l'expliquer ?

Ce que j'ai fais pour l'instant dans client_2:
public Socket clientSocket;
String IpSource = "192.168.1.46";

IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(IpSource), 80);
clientSocket.receive(???????????????) //Je sais pas quoi mettre dedans


Est-ce que je suis sur le bon chemin ou pas du tout ?
Grégory
Messages postés
39
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
24 avril 2014

Bonjour a tous
J'ai réussis a pas mal m'avancer avec les sockets, mais il y a encore 1 seul problème. Je cherche comment bien recevoir un message. Pour l'instant, pour que mon message s'affiche, je dois le mettre dans un "button_Click", sinon les autres solutions que j'ai essayé, mon programme plantait des le début de son exécution.
  private void button4_Click(object sender, EventArgs e)
        {
            textBox2.Text = "";
            
            socket.Receive(buffer2);
            System.Text.Encoding encoding = System.Text.Encoding.UTF8;
            textBox2.Text = encoding.GetString(buffer2); 
            
        }


Je voudrais que le message s'affiche automatiquement a la réception de quelque chose. Vers qu'elle solution je dois me retourner.
Merci de votre aide.
Grégor
Messages postés
39
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
24 avril 2014

Bonjour a tous

Il y a déjà quelque temps que j'ai écris ma question sur les sockets. Peut être qu'il y a d'autre personne qui pourrait être intéressé par ce que j'ai trouvé et compris.
Je vous mes donc ci-dessous mon code. Il y loin d'être parfait, mais il marche et il y a quelque commentaire. Pour que celui-ci fonctionne j'ai relié mon ordi a une carte arduino avec un shield ethernet. L'adresse ip de la carte arduino est 192.168.1.77. Ma carte me retourne automatiquement ce que je lui ai envoyer.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            
            endPoint = new IPEndPoint(IPAddress.Parse("192.168.1.77"), 80);  // Ip et port de destination 
        }
        Socket socket; // Nom de la fonction
        IPEndPoint endPoint; // adresse et port de destination
        byte[] buffer; // message qui sera  envoyer
        int Bouton = 0; // connexion/déconnexion/Autorisation d'envoyer un message 
        int size = 20; // Définie le nb de caractère max a envoyer
        
        Byte[] rep = new Byte[32767]; // message réponce reçu 
        string stringData; // message réponce afficher
        string TextaEnvoyer; // Text transformer qui ira a la fonction envoyer
        int recv; // Nombre de caractère recu
       
       
        
        private void button1_Click(object sender, EventArgs e)
        {
            if (Bouton == 0)//Connexion
            {
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);  //Initialise la connexion udp
                socket.BeginConnect(endPoint, new AsyncCallback(BeginConnect), socket);//Initialise réception asynchrone des messages
                
                Bouton = 1;
            }
            else if (Bouton == 1)//Connexion
            {
                Bouton = 0;//Déconnexion
                socket.Shutdown(SocketShutdown.Both);//Ferme le protocole 
            }
        }
        public void BeginConnect(IAsyncResult ar)//Reception asynchrone des messages
        {
            socket = (Socket)ar.AsyncState;
           
                socket.BeginReceive(rep, 0, size, SocketFlags.None, new AsyncCallback(CallbackMethod), socket);
                socket.EndConnect(ar);
        }
        private void CallbackMethod(IAsyncResult ar)//Reception asynchrone des messages
        {
            Socket remote = (Socket)ar.AsyncState;
            recv = remote.EndReceive(ar);
            socket.BeginReceive(rep, 0, size, SocketFlags.None, new AsyncCallback(CallbackMethod), socket);
            this.Invoke(new EventHandler(DisplayText));
        }
        private void DisplayText(object sender, EventArgs e)//Affiche les messages
        {
            stringData = Encoding.ASCII.GetString(rep, 0, recv);
            richTextBox1.Text += stringData + System.Environment.NewLine;
        }
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            socket.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            TextaEnvoyer = textBox1.Text;
            buffer = Encoding.ASCII.GetBytes("<"+TextaEnvoyer+">");
            socket.SendTo(buffer, endPoint); //buffer= message en byte, endPoint est l'adresse de destination
        }
    }
}


J'aimerais maintenant pouvoir brancher ma carte arduino a mon routeur et communiqué avec elle en wifi. Seulement ça ne fonctionne pas. Je me demandais si je devais spécifier quelque par le masque du réseau et l'adresse du routeur ? Si oui comment ?

Merci
Grégory