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 :

utilisation des sockets - comment écouter sans connaitre l'ip de l'hôte


Sujet :

C#

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut utilisation des sockets - comment écouter sans connaitre l'ip de l'hôte
    réécriture du sujet

    bonjour,
    j'aimerais réaliser un script dans mon appli serveur pour écouter tout ce qui pourrait venir de chez mes clients, seulement je ne connais pas leurs adresses ip. comment puis-je faire ?

    voici mon code coté serveur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public MainForm()
    {
        InitializeComponent();
     
        SocketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    }

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    écoute sur le port 127.0.0.1 ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    aucune idée, c'est la première fois que je m'intéresse aux sockets, c'est du chinois pour moi.
    voici le code que j'ai réussi à écrire en m'inspirant d'un tuto de developpez.com

    http://stephaneey.developpez.com/tut...otnet/sockets/

    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
    39
    40
    41
    42
    43
    44
    public Socket ServerSocket;
            public IPAddress ipAddress;
     
            public MainForm()
            {
                InitializeComponent();
            }
     
            public void Start()
            {
                // on cherche notre adresse ip
                ipAddress = AdresseIpLocale(Dns.GetHostName());
                // création de la socket
                ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                try
                {
                    //On lie la socket au point de communication
                    ServerSocket.Bind(new IPEndPoint(ipAddress, 8000));
                    //On la positionne en mode "écoute"
                    ServerSocket.Listen(10);
                }
                catch (SocketException E)
                {
                    Console.WriteLine(E.Message);
                }	
            }
     
            /// <summary>
            /// obtenir l'adresse ip à partir d'un DNS
            /// </summary>
            /// <param name="DNS"></param>
            /// <returns></returns>
            public IPAddress AdresseIpLocale(string DNS)
            {
                IPHostEntry host = Dns.GetHostEntry(DNS);
                foreach (IPAddress ip in host.AddressList)
                {
                    if (ip.AddressFamily.ToString() == "InterNetwork")
                    {
                        return ip;
                    }
                }
                return null;
            }
    en fait, j'aimerais que lorsqu'un client se connecte il me le signal. je eux donc avoir plusieurs clients, mais je ne connais pas leurs ip.

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ok, donc pas de soucis, quand sur le serveur vu que tu ne connais pas l'ip des futur clients, tu n'as pas à la donner

    une fois le listen effecté, il faut soit faire .accept soit .beginaccept

    m'enfin les sockets c'est pas simple du tout, et quit à perdre du temps, regarde .net remoting, ca encapulse tout ce qui est socket, et tu as juste à te concentrer sur ce que tu veux faire transiter par le réseau
    (ou éventuellement WCF)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    merci beaucoup pour les infos, j'essaierais ça aussitôt que possible
    j'ai une petite question, est-il possible de recevoir des objets par sockets ?
    en fait je n'ai aucune idée du genre de données qu'on peut émettre ou recevoir >_<

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    avec le socket de base on envoi/recoit des octets
    on se retrouve aussi avec la coupure des 8ko, il faut donc gérer la "concaténation" des octets en cas de dépassement

    avec .net remoting en gros on expose une instance d'une classe, et les clients qui se connecte en remoting peuvent lire et écrire dans les propriétés de cette classe, appeler des sub et fonction sur le serveur
    seules des données sérialisables peuvent passer, mais au moins tu n'as rien à te préocuper niveau transfert, ca s'occupe de tout
    tu peux transférer des images, des integer etc...

    par contre c'est pas forcément simple à comprendre et ca demande donc un peu de temps d'apprentissage (il faut en général une interface utilisé dans chaque programme pour caster l'objet partagé)
    enfin y a des tutos qui expliquent plutot bien comment mettre ca en place avec des exemples de code qui fonctionnent
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 33
    Points : 33
    Points
    33
    Par défaut
    j'ai une petite question, est-il possible de recevoir des objets par sockets ?
    oui ,mais il faut passer par la serialisation !

    @ Pol63:je suis tres interessé par le Remoting ,Alors peut tu me conseiller quelques tutos ou livres (en français ou en anglais)

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    aucune idée, j'ai juste essayé une fois, et j'avais trouvé un tuto sur ce site (voir en haut de page)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    merci pour vos réponses

    bon, j'aimerais récupérer le nom du pc et son adresse ip dans la fonction suivante (ip_client et nom_pc_client) :

    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
    39
    40
    41
    42
    43
    44
    public void liste_clients()
            {
                // valorise connexionStatus à TRUE si l'hôte est connecté
                // sinon on cré un nouveau client, avec un connexionStatus = TRUE dès le départ
                while (true)
                {
                    // ici je veux recevoir le nom du pc, et l'adresse ip des clients qui m'envoient ces mêmes données
                    IPAddress ip_client = null;
                    string nom_pc_client = null;
     
                    webcam_client un_hote = null;
     
                    // le client existe t-il déjà ?
                    int nb_client = les_hotes.Count;
                    int i = 0;
                    bool trouve = false;
                    while ((i < nb_client) || (!trouve))
                    {
                        un_hote = ((webcam_client)les_hotes[i]);
                        if ((un_hote.computerName == nom_pc_client) && (un_hote.ip == ip_client))
                        {
                            trouve = true;
                        }
                        else
                        {
                            i++;
                        }
                    }
     
                    // s'il existe, alors on signale qu'il est connecté, sinon on l'ajoute à la collection
                    if (trouve)
                    {
                        un_hote.connexionStatus = true;
                    }
                    else
                    {
                        un_hote = new webcam_client { computerName = nom_pc_client, ip = ip_client, connexionStatus = true };
                        les_hotes.Add(un_hote);
                    }
     
                    // on relance la fonction toutes les 10 secondes
                    Thread.Sleep(10);
                }
            }
    cette fonction, une fois quelle fonctionnera, modifiera mes objet pour dire que telle personne est connectée. mais j'aimerais aussi savoir qui n'est plus connecté, soit à cause d'un plantage de connexion, soit parce qu'il est tout simplement parti... mais là je suis HS, je ne sais pas du tout comment m'y prendre.
    autre chose, pour l'instant cette fonction est en c#2, mais dès que j'aurais compris la syntaxe du LINQ, je ferais la même chose en version c#3 avec ce que j'appelle personnellement le code pseudo SQL (vous me comprenez ^^)

  10. #10
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    pas de réponse ?
    s'il vous plait, aidez moi
    j'ai une idée mais vous allez surement me dire que c'est la solution bricolo >_<

    c'est possible d'envoyer un message de la forme :
    nom_pc:blabla;ipxx.xxx.xxx.xxx

    c'est pas trop la honte ? y-a-t'il mieux que ça ?

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/03/2014, 17h54
  2. [c#] Utilisation des sockets
    Par zwoke dans le forum Windows Forms
    Réponses: 1
    Dernier message: 28/09/2006, 09h28
  3. [Socket][C++]Utilisation des sockets sur internet
    Par ChriGoLioNaDor dans le forum Développement
    Réponses: 8
    Dernier message: 13/01/2006, 21h38
  4. [MFC] Faible utilisation des sockets via les MFC ?
    Par Yellowmat dans le forum MFC
    Réponses: 1
    Dernier message: 25/08/2005, 17h15
  5. utilisation des sockets sous windows
    Par Tupac dans le forum Réseau
    Réponses: 2
    Dernier message: 21/12/2002, 18h24

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