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 :

sockets: "connecté" du côté client mais pas du côté serveur


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut sockets: "connecté" du côté client mais pas du côté serveur
    Je ne parviens pas à, ne serait-ce que commencer un début de dialogue client / serveur
    Je me suis inspiré de plusieurs sources un peu différentes mais qui au final reviennent au même.
    Le serveur attend, et ne fait rien, jusqu'à être contacté par un client
    Mais mon client se connecte (du moins en apparence) sans que le serveur le voit et ce à condition que j'utilise le port 143
    si je désactive le serveur, le client se connecte quand même (je ne sais où!)
    Je suis un tout petit peu perdu
    Serveur:****************************************
    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
    45
    46
    47
    48
    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.Sockets;
    using System.Net;
    namespace dserver
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public Socket sock=null, actif=null; string iplocale;
            private void Form1_Load(object sender, EventArgs e)
            {
     
               sock = new Socket(
         AddressFamily.InterNetwork,
         SocketType.Stream,
         ProtocolType.Tcp);
             //   IPEndPoint iep = new IPEndPoint(IPAddress.Parse("192.168.0.106"), 17000);//143
                IPEndPoint iep = new IPEndPoint(IPAddress.Any, 143);//143
                iplocale = iep.Address.ToString();
                sock.Bind(iep);
                sock.Listen(1);
              //  Socket actif = sock.Accept();
               this.Text = "ok";
                timer1.Start();        }
     
            private void timer1_Tick(object sender, EventArgs e)
            {  //ne sert qu'à différer sock.Accept
                timer1.Stop();
     
                this.Text =iplocale + " en atente de connection..";
                actif = sock.Accept();
                this.Text = "Connecté!";
     
            }
     
        }
    }
    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
    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;
     
    namespace dClient
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public Socket sock; public IPEndPoint iep; int i = 0;
            private void Form1_Load(object sender, EventArgs e)
            {
     
     
                sock = new Socket(  AddressFamily.InterNetwork,  SocketType.Stream,     ProtocolType.Tcp);
                string ip = "179.218.193.77";     //port redirigés dans routeur 
                //ip="192.168.0.106";//pour tester en local
                 iep = new IPEndPoint(IPAddress.Parse(ip),143);//143
     
     
            }
     
            private void con_Click(object sender, EventArgs e)
            {
                //pour maitriser sock.connect
                sock.Connect(iep);
                this.Text = "connecté "  ;
            }
        }
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    salut

    parfois, quand je fais de la communication client / serveur (sur mon réseau), je suis obligé de désactivé le firewall (c'est souvent plus rapide que de créer une expection).

    Je te conseille, puisque tu veux faire du TCP d'utiliser les classes TcpListener et TcpClient... tu verras, les exemples sont nombreux sur le net et c'est beaucoup
    plus rapide et simple à utiliser que d'attaquer les sockets (qui sont vraiment le niveau 0).
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Toujours perdu!
    J’avais bien pensé à désactiver, en vain, le pare-feu Windows.
    J’ai suivi ta suggestion TcpListener + TcpClient, mais j’arrive sensiblement à la même impasse.
    En m’appuyant sur ‘ 127.0.0.1 ‘ ou sur l’IP locale + port quelconque (serveur ET client)
    J’obtiens côté client une socketsException 0X800040005 (temps dépassé)
    Si je ne lance que le client, le résultat est identique (ce qui est, pour le moins logique), sauf si j’utilise le port 143, auquel cas la référence de l’exception reste le même, mais le motif n’est plus le « temps dépassé », mais le « refus express par l’ordinateur cible »
    Je pense que je dois commettre une grossière erreur, mais laquelle?

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    salut

    Principe coté serveur:

    Un Thread qui ne fait que du TcpListener et qui sur réception, crée un nouveau thread d'écoute pour le TcpClient fournit par le TcpListener

    Coté client : TcpClient de façon simple...

    http://www.codeproject.com/Articles/...r-written-in-C
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Pas si simple car la solution serveur n'est pas compatible avec VS 2015!

  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
    il ne faut pas utiliser la classe socket, elle est trop compliquée

    en simplifié il y a TcpListener et TcpClient
    au passage le .accept sur un timer ce n'est pas une bonne idée
    et le .accept doit être fait à chaque fois qu'un client se connecte, sinon tu ne pourras avoir qu'une connexion


    dans le principe sur le tcplistener il faut faire .bind et .listen
    ensuite il faut .accept ou .beginaccept
    .accept est bloquant (l'exécution est figée sur cette ligne tant qu'aucun client se connecte, donc sur une application autre que console ca marque "ne répond pas")
    quand le client fait .connect, ca débloque le .accept côté serveur (ou ca passe en timeout si pas de connexion possible)
    .beginaccept démarre un thread d'attent, donc ca ne bloque pas ton code, et il faut fournir un callback dans lequel on fait endaccept, le mot callback peut faire peur mais ce n'est qu'un pointeur vers une sub un peu comme un évènement

    après le .accept ou le .endaccept il faut refaire un .Accept ou un .beginaccept pour pouvoir accepter la connexion suivante (sur le endaccept c'est assez simple vu qu'il est sur une sub)


    et ca va être la même histoire pour la lecture des données, soit .Read qui bloque, soit .beginread pour gestion comme un event (qu'il faut là aussi rappeler dans la foulée pour pouvoir recevoir à nouveau)


    en général on choisit donc entre un thread qu'on créé soi même et les méthodes synchrones ou les méthodes asynchrones (qui implémentent des threads)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    et si vraiment, tu veux te simplifier la vie, tu peux utiliser MQTT... comme ça, tu seras tranquille, ya quasiment tout de fait...

    ou bien utiliser une librairie comme celle de Lidgren : http://genericgamedev.com/tutorials/...-csharp-games/
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut TcpListener sourd
    Lorsque le pgm ci dessous est lancé, la commande "telnet ip port" génère le message "impossible d'ouvrir une connexion à l'hôte"
    Lorsque le pgm n'est pas lancé, le message est le même, mais laréponse beaucoup plus longue à venir


    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    using System;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
     
    class MyTcpListener
    {
        public static void Main()
        {
            TcpListener server = null;
            try
            {
                // Set the TcpListener on port 13000.
                Int32 port = 1430;
                IPAddress localAddr = IPAddress.Parse("192.168.0.106");
     
                // TcpListener server = new TcpListener(port);
                server = new TcpListener(localAddr, port);
     
                // Start listening for client requests.
                server.Start();
     
                // Buffer for reading data
                Byte[] bytes = new Byte[256];
                String data = null;
     
                // Enter the listening loop.
                while (true)
                {
                    Console.Write("Waiting for a connection... ");
     
                    // Perform a blocking call to accept requests.
                    // You could also user server.AcceptSocket() here.
                    TcpClient client = server.AcceptTcpClient();
                    Console.WriteLine("Connected!");
     
                    data = null;
     
                    // Get a stream object for reading and writing
                    NetworkStream stream = client.GetStream();
     
                    int i;
     
                    // Loop to receive all the data sent by the client.
                    while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        // Translate data bytes to a ASCII string.
                        data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                        Console.WriteLine("Received: {0}", data);
     
                        // Process the data sent by the client.
                        data = data.ToUpper();
     
                        byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
     
                        // Send back a response.
                        stream.Write(msg, 0, msg.Length);
                        Console.WriteLine("Sent: {0}", data);
                    }
     
                    // Shutdown and end connection
                    client.Close();
                }
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
            }
            finally
            {
                // Stop listening for new clients.
                server.Stop();
            }
     
     
            Console.WriteLine("\nHit enter to continue...");
            Console.Read();
        }
    }

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Etant donné que tout me laissait penser que le programme DEVAIT fonctionner, je l'ai testé sur un autre ordinateur et effectivement, comme je l'espèrais, j'ai bien obtenu le résultat souhaité.
    Win 10 + avast: a priori pas de différence.... sauf qu'il y en a forcément une
    Une différence, cependant, les 2 ordis ne sont pas sur le même réseau, mais ça ne me semble pas significatif
    Toute idée sera la bienvenue

    Citation Envoyé par ghel2000 Voir le message
    Lorsque le pgm ci dessous est lancé, la commande "telnet ip port" génère le message "impossible d'ouvrir une connexion à l'hôte"
    Lorsque le pgm n'est pas lancé, le message est le même, mais laréponse beaucoup plus longue à venir


    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    using System;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
     
    class MyTcpListener
    {
        public static void Main()
        {
            TcpListener server = null;
            try
            {
                // Set the TcpListener on port 13000.
                Int32 port = 1430;
                IPAddress localAddr = IPAddress.Parse("192.168.0.106");
     
                // TcpListener server = new TcpListener(port);
                server = new TcpListener(localAddr, port);
     
                // Start listening for client requests.
                server.Start();
     
                // Buffer for reading data
                Byte[] bytes = new Byte[256];
                String data = null;
     
                // Enter the listening loop.
                while (true)
                {
                    Console.Write("Waiting for a connection... ");
     
                    // Perform a blocking call to accept requests.
                    // You could also user server.AcceptSocket() here.
                    TcpClient client = server.AcceptTcpClient();
                    Console.WriteLine("Connected!");
     
                    data = null;
     
                    // Get a stream object for reading and writing
                    NetworkStream stream = client.GetStream();
     
                    int i;
     
                    // Loop to receive all the data sent by the client.
                    while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        // Translate data bytes to a ASCII string.
                        data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                        Console.WriteLine("Received: {0}", data);
     
                        // Process the data sent by the client.
                        data = data.ToUpper();
     
                        byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
     
                        // Send back a response.
                        stream.Write(msg, 0, msg.Length);
                        Console.WriteLine("Sent: {0}", data);
                    }
     
                    // Shutdown and end connection
                    client.Close();
                }
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
            }
            finally
            {
                // Stop listening for new clients.
                server.Stop();
            }
     
     
            Console.WriteLine("\nHit enter to continue...");
            Console.Read();
        }
    }

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Merci de vos comentaires et conseils
    Je vais me diriger vers la solution MQTT car elle correspond bien à l'esprit de ce que je veux faire (communication PC <==> arduino via internet)
    Mais j'aurais quand même aimé pourquoi TcpListener est sourd sur un PC et pas sur les autres!
    Merci à tous

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/08/2012, 22h22
  2. Réponses: 4
    Dernier message: 27/05/2010, 16h57

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