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 :

Serveur: TcpListener et TcpClient


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 112
    Par défaut Serveur: TcpListener et TcpClient
    Bonjour les experts;

    Je roule sous XP Ed Fam, 2 GO de Ram, 1TO de disque dur …
    mon PC dispose d'une carte réseau mais qui n'est pas raccordé.
    Quand dans le «*Panneau de Configuration*» de XP, je vais dans «*Connexion réseau*», l'activation de ma carte réseau échoue et je pense que cela est dû à la non connexion de ma carte sur un hub ou un switch ou encore un routeur …
    Est ce vrai ?
    De plus, je programme sous Visual Studio 2005 Standard (oui je sais c'est viellot) et je me lance dans la programmation de Client Serveur pour echange de données.
    J'ai Net.Framework 3.5 SP1
    Pour le Serveur, je me suis très inspiré de l'exemple de votre tutoriel sur «*Les réseaux*» qui utilise l'interface LoopBack (boucle logicielle) de ma carte avec comme adresse «*127.0.0.1*» et comme port: 13000.
    Un extrait de code pour utilisation de TcpListener qui ecoute le port 13000

    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
    // Set the TcpListener on port 13000.
            Int32  port = 13000;
     
        //  IPAddress[] t_ip_adr = Dns.GetHostAddresses( Dns.GetHostName() );
            IPAddress localAddr = IPAddress.Parse( "127.0.0.1" );
     
        // TcpListener server = new TcpListener(port);
            server = new TcpListener( localAddr, port );
     
        // ici exception Socket avec erreur code 10042 vu dans le deboggage dans la propriété  «*server.Server.EnableBroadcast*»
     
        // Serveur_defaut est une variable locale pour mes besoins
            this.Serveur_defaut = server;
     
        // Start listening for client requests.
            server.Start();
     
        //  quelques lignes plus bas
            TcpClient client = server.AcceptTcpClient();
     
          ........
    Mon problème est le suivant:
    Quand je lance le serveur par bouton (dans une Winform), tout semble Ok. Outre le blocage fonctionnel normal sur la methode «*server.AcceptTcpClient()*», ma fenêtre serveur (WinForm)reste bloquée: impossible de la fermer par le coche en haut à droite. Dans le gestionnaire de tâches (XP), l'application ne répond pas et seule une action forte «*Terminer maintenant*» permet de clore l'appli.
    Piste suivie dans le déboggage, une Exception Socket est levé dans la propriété «*EnableBroadcast*» avec «*Error code 10042*». La recherche dans MSDN ou Base ce connaissances Microsoft parle de «*Mauvaise option de protocole*» alors que je n'en ai porté aucune et suis sous XP SP3 et Net.Framework 3.5 SP1.
    Bad protocol option. An unknown, invalid or unsupported option or level was specified in a getsockopt or setsockopt call.
    je pense que le blocage vient de là.
    Qui a une idée de la solution ???

    Je débute dans ce genre de programmation (Serveur client) aussi j'ai besoin de bons conseils. Et je ne manquerai pas de relire vos tutos. Je n'ai pas pu télécharger le code exemple de votre tuto en format txt.

    Grand merci à vous d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    C'est normal, la méthode AcceptTcpClient bloque jusqu'à ce qu'un client se connecte. Si tu l'appelles sur le thread de l'interface graphique (thread "principal"), l'application ne peut plus traiter les messages Windows, et donc elle ne répond plus.

    Il faut soit appeler AcceptTcpClient sur un autre thread, soit utiliser la version asynchrone BeginAcceptTcpClient

  3. #3
    Membre émérite Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Par défaut
    lance ta méthode qui écoute dans un nouveau thread.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 112
    Par défaut
    Merci à vous tomlev et chamamo pour votre conseil.

    Ok je vais me lancer dans cette demarche.
    En fait, je debute par un exercice (trés basique pour vous mais pas si simple pour moi !!!):
    Dans une Winform,
    - coté serveur, j'ai deux boutons: "Lancement" et "Arrêt" et une Listbox pour visualiser le déroulement des actions.
    - coté client, une textbox pour ecrire le message prêt à envoyer, un boutton "Envoi msg" et une Listbox pour visualiser les actions effectuées.
    Bien sûr avec toutes les sécurités fonctionnelles... exemple si le serveur n'est pas lancé impossible d'envoyer un msg ...
    Si j'ai bien compris un thread secondaire sera à l'ecoute des connexions entrantes sur le serveur. Et si ce thread veut ecrire dans la Listbox: utilisation de délégué avec methode Invoke sur la Listbox si InvokeRequired == true ....
    Et idem coté client ...
    Une question subsidiaire: quel est le critère de choix pour créer un serveur synchrone plutôt qu'un serveur asynchrone ??? J'imagine que le nombre de clients potentiels influe ainsi que la quantité de données échangée. Suis je dans le vrai ???
    Ok je vais me lancer ....mais pas tout de suite ... encore un peu de vacances au mois d'Âoût !!!
    Encore une fois Grand merci a vous deux ... et c'est sûr j'aurai encore besoin de vos compétences.
    - et aussi sur un autre thread coté client

  5. #5
    Membre émérite Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Par défaut
    un serveur synchrone plutôt qu'un serveur asynchrone ???
    j'ai du mal à comprendre cette phrase.

    par rapport aux nombres de clients, tu peux le contrôler niveau serveur, tu n'acceptes plus les connexions entrantes une fois le nombre max que tu as défini est atteint.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 112
    Par défaut
    Chamamo pour m'exprimer autrement ..
    Je pourrai poser la question ainsi: quel est l'avantage d'un fonctionnement asynchrone d'un serveur par rapport à un fonctionnement synchrone ??? Cela dépend-il des fonctionnalités demandées au serveur ???

    Et voila que survient une Exception Socket nouvelle :
    - j'utilise la boucle logicielle de ma carte réseau (Loop Back à l'adresse 127.0.0.1) et le port 13000 donc mon IPEndPoint est "127.0.0.1:13000"
    - le serveur ecoute (TcpListener) sur ce IPEndPoint.
    - et le client se connecte (TcpClient) sur ce même IPEndpoint.
    - et l'Exception Socket qui me dit que le même IPEndPoint ne peut être utilisé qu'une seule fois. Alors on est obligé d'avoir deux machines (une serveur et une client) ???

    Merci d'avance de votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. TCPClient et TCPListener
    Par mehdi_862000 dans le forum Framework .NET
    Réponses: 12
    Dernier message: 26/05/2008, 16h33
  2. Réponses: 2
    Dernier message: 25/04/2008, 19h31
  3. TCPClient et TCPListener
    Par TheOutlawz dans le forum VB.NET
    Réponses: 4
    Dernier message: 13/04/2008, 18h29
  4. Réponses: 7
    Dernier message: 20/03/2008, 12h25
  5. transfert fichier avec API tcpClient-Serveur
    Par migutz dans le forum VB.NET
    Réponses: 2
    Dernier message: 14/11/2007, 14h06

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