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

Développement Discussion :

threads simultanes sur une meme socket


Sujet :

Développement

  1. #1
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut threads simultanes sur une meme socket
    bien le bonjour,

    je manipule une socket bloquante en lecture et en ecriture.
    ne sachant pas trop si c'etait possible, je me suis lance dans l'heresie (?) suivante:
    sur la meme socket, j'ai un thread qui lit et un autre qui ecrit. Donc le thread de lecture consiste en une boucle infinie d'attente tandis que le thread d'ecriture consiste juste en une suite d'envois.

    c'est une socket sur laquelle je fais donc un dialogue avec un serveur. Il repond aux messages que j'envoie.

    Et je me suis apercu que ca fonctionnait. Ma question est donc la suivante: est-ce dangereux d'utiliser 2 threads simultanes sur la meme socket ?
    y a-t-il des precautions a prendre ?
    dois-je verouiller la socket avec des mutex ? ou bien est-ce le systeme qui se charge d'eviter des acces au meme instant ?
    Ou bien au contraire, est-ce une methode propre et massivement utilisee ?

  2. #2
    Membre expérimenté
    Avatar de Aramis
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 493
    Points : 1 638
    Points
    1 638
    Par défaut
    Bonjour,

    Je ne pense pas que cela soit un probleme. Le socket herite probablement du fonctionnement de l'interface sur laquelle il "tourne". Je m'explique. Les interfaces reseaux typiquement fonctionnent en Half-Duplex ou bien en Full Duplex. Dans le premier cas, l'interface ne peut faire qu'une chose a la fois c'est a dire recevoir ou envoyer. En Full-Duplex, les deux peuvent se passer en meme temps! Pourquoi serai ce un probleme au niveau de la couche applicative?

    Par consequent, si votre interface fonctionne en Half-Duplex il est impossible que votre application est a Lire et Ecrire en meme temps. Voila comment je procede:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Application
    *---ConnectionTCP
          *---Ecouter
          *---Envoyer
    Ce qui donne en gros:
    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
    public GenTCPClient(string server, int port)
    	{
    		if &#40;port <= 0 || port >= 65535&#41;
    		&#123;
    			throw new ArgumentOutOfRangeException&#40;"Port number must be between 1 and 65535"&#41;;
    		&#125;
    		
    		try
    		&#123;
    			this.serverName = server;
    			this.port = port;
    			client = new TcpClient&#40;server, port&#41;;
    			connected = true;
    		        send    = new ClientSend&#40;client&#41;;
    			receive = new ClientReceive&#40;client, ServerDetails&#41;;
    			receive.Start&#40;&#41;;
    		&#125;
    		catch &#40;Exception Ex&#41;
    		&#123;
    			connected = false;
    			throw Ex;
    		&#125;
    	&#125;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    internal ClientReceive&#40;TcpClient client, string serverName&#41;
    	&#123;
    		this.client = client;
    		input = new StreamReader&#40;client.GetStream&#40;&#41;&#41;;
    		this.serverName = serverName;
    		thread = new Thread&#40;new ThreadStart&#40;Run&#41;&#41;;
    	&#125;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    internal ClientSend&#40;TcpClient client&#41;
    	&#123;
    		output = new StreamWriter&#40;client.GetStream&#40;&#41;&#41;;
    		output.AutoFlush = true;
    	&#125;
    Comme vous l'avez probablement fait, je passe une reference aux differentes classes afin que le programme sache quel socket est a contacter.

    Pour finir, tout ca ne marche que grace a l'unicite de la communication. Tout client ouvre un port au hazard et seul le port de destination (server) est connu. Par consequent, l'unicite de la communication est determine par l'adresse du client, le port utilise, l'adresse du server et le port de destination. Avec tout ca, il est clair qu'un probleme d'acces simultane ne peut etre que tres rare.

    Tous ces chercheurs qui ont mis au point les protocols de communication reseaux ont bien fait leur boulot je trouve

    Bonne continuation,

    Ar@mi$

  3. #3
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    merci pour ta reponse Aramis, j'ai bien aime le code pour l'illustrer

    une petite precision,
    Citation Envoyé par tu
    Les interfaces reseaux typiquement fonctionnent en Half-Duplex ou bien en Full Duplex.
    le caractere half ou full duplex de l'interface depend-il d'un composant logiciel mis en oeuvre par le systeme ou bien est-ce inscrit dans les composants de la carte reseau ?

    Et pour ma culture personnelle, y a-t-il moyen de changer le full duplex en half (et inversement) d'une interface reseau d'une maniere ou d'une autre ?

  4. #4
    Membre expérimenté
    Avatar de Aramis
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 493
    Points : 1 638
    Points
    1 638
    Par défaut
    Re,

    Citation Envoyé par khayyam90
    le caractere half ou full duplex de l'interface depend-il d'un composant logiciel mis en oeuvre par le systeme ou bien est-ce inscrit dans les composants de la carte reseau ?
    "Inscrit dans le composant" est un peu fort mais il est vrai que cette caracteristique vient de la second couche du model OSI (e.g. data link) et donc souvent associe au propriete "physique" de l'interface.
    Citation Envoyé par khayyam90
    Et pour ma culture personnelle, y a-t-il moyen de changer le full duplex en half (et inversement) d'une interface reseau d'une maniere ou d'une autre ?
    Oui, il est possible de changer le mode de communication de l'interface. D'ailleurs la plus part des cartes reseaux par exemple supportent plusieurs vitesses et plusieurs mode communication. Le protocol "Handshake" utilise a ce niveau veut que les interfaces essayent les possibilites suivantes:
    • 100 Mbps Full Duplex
      100 Mbps Half Duplex
      10Mbps Full Duplex
      10Mbps Hald Duplex

    Mais pourquoi "les interfaces" et non l'interface? Fondamentalement, un reseau est consitute d'un infinite de communications point a point et "Duplex" (Half/Full) definit les proprietes de cette communication (cf. mon poste precedent). Normalement, les interfaces sont en automatique pour ce genre de chose et c'est la machine la plus faible qui dicte la vitesse et mode de communication.

    Je sens arriver la question: Peut on changer le mode par programmation? La reponse est oui! Par contre je ne pense pas que cela soit particulierement evidement. Qui plus est il faut que l'equipement auquel interface reprogramme est connectee le permette!

    Ar@mi$ network astronaute

  5. #5
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    Re,

    et dans la serie 'pour la culture personnelle', dans le cas d'une utilisation half-duplex, quel est le comportement du systeme lors d'une lecture et ecriture simultanees via 2 threads. Disons par exemple que la lecture debute mais prend du temps et pendant ce temps, un autre thread tente d'ecrire.

    Y a-t-il une mise en attente de l'instruction d'ecriture, une erreur ? Est-ce un comportement indefini ? La reaction est-elle normalisee ?

  6. #6
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 75
    Points : 73
    Points
    73
    Par défaut
    Bonjour
    je reviens sur le début du sujet.
    On utilise la socket avec lecture bloquante pour établir une conversation client serveur synchrone.
    Donc le client envoie une requête et passe sur l instruction de lecture (bloquante), le serveur répond.
    Par exemple :
    le client envoie le message « heure »
    Le serveur en attende sur la lecture capte le message, analyse la requête et répond (12:00) au client.
    Le client doit aussi être capable d’interpréter la réponse si la communication permet plusieurs types requêtes.

    Donc dans se type de client-serveur les threads du coté client ne sont pas indispensable mais comme l’a dit Aramis la manière que vous utilisez ne cause pas de problème.
    Pour moi ce n’est pas une méthode massivement utilisé.
    Dans ce type de conversation les threads sont utilisé du coté serveur pour pouvoir créer un serveur multi-connexion

    Sinon du coté client les threads sont utilisé dans le cas d’utilisation de plusieurs sockets comme par exemple dans un client FTP.
    Cela permet d'évite qu’une lecture sur une socket bloque l’écriture sur l’autre.

  7. #7
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    ma conversation entre le client est le serveur n'est pas tout a fait sur le mode question reponse.

    le client envoie des requetes au serveur et attend ses reponses, mais le serveur peut aussi a tout instant envoyer des donnees au client, c'est la raison pour laquelle j'utilise un thread permanent de lecture du cote de mon client. (je n'ai droit qu'a une seule socket)

  8. #8
    Membre expérimenté
    Avatar de Aramis
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 493
    Points : 1 638
    Points
    1 638
    Par défaut
    Citation Envoyé par khayyam90
    [...]
    dans le cas d'une utilisation half-duplex, quel est le comportement du systeme lors d'une lecture et ecriture simultanees via 2 threads. Disons par exemple que la lecture debute mais prend du temps et pendant ce temps, un autre thread tente d'ecrire.

    Y a-t-il une mise en attente de l'instruction d'ecriture, une erreur ? Est-ce un comportement indefini ? La reaction est-elle normalisee ?
    Par la nature meme du mode half-duplex, cela n'arrivera jamais. Le "stack" de l'interface reseaux, mettra les donnes a envoyer/recevoir dans une zone tampon en attendant qu'il soit physiquement possible de proceder a l'action suivante. Vu comme les protocols reseaux sont utilises je dirais sans hesitations que ces comportement sont normalises. Apres tout la plus part des developpeurs commencent a coder a partir de la couche 3/4 (adressage/transport) et par consequent leur code herite des proprietes des couches inferieures. khayyam90. vous devez bien realiser que votre application va fonctionner sur une variete d'interfaces (filaires, sans fils ...). Si vous deviez vous souciez de toutes les possibilites ou bien permutations, vous n'en finirez jamais. Les protocols sont la pour vous aider

    Ar@mi$

  9. #9
    Membre expérimenté
    Avatar de Aramis
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 493
    Points : 1 638
    Points
    1 638
    Par défaut
    Citation Envoyé par khayyam90
    ma conversation entre le client est le serveur n'est pas tout a fait sur le mode question reponse.

    le client envoie des requetes au serveur et attend ses reponses, mais le serveur peut aussi a tout instant envoyer des donnees au client, c'est la raison pour laquelle j'utilise un thread permanent de lecture du cote de mon client. (je n'ai droit qu'a une seule socket)
    Depuis le debut du sujet vous avez precisez que votre socket etait tout le temps a lecoute mais que l'envoie etait ponctuel. Dans mon experience a moi tout seul que je partage avec moi meme, j'estime que c'est LA chose a faire dans 90% des applications client/server et du coup vous avez eviter pas mal de problemes. Qui plus est, du point de vue des developpeurs cette histoire d'envoi de la part du client ou du server a avoir avec l'application c'est a dire la tache a remplir alors que les autres taches du protocol (par exemple TCP: synchro, taille de la fenetres et etc) se font en transparence totale!

    Ar@mi$

  10. #10
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    Citation Envoyé par Aramis
    Vu comme les protocols reseaux sont utilises je dirais sans hesitations que ces comportement sont normalises.

    Citation Envoyé par Aramis
    [...]j'estime que c'est LA chose a faire dans 90% des applications client/server et du coup vous avez eviter pas mal de problemes.
    encore

    j'ai donc fait les bons choix avec ma gestion de threads sur ma socket
    encore

    merci bien de toutes ces precisions.

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

Discussions similaires

  1. [Perl] lecture/écriture simultanées sur une socket
    Par sephiburp dans le forum Programmation et administration système
    Réponses: 10
    Dernier message: 16/10/2007, 10h25
  2. plusieurs threads ecrivent sur la meme socket
    Par estergiou dans le forum C++
    Réponses: 3
    Dernier message: 04/11/2005, 01h38
  3. Association 1:n sur une meme table
    Par dafalcon dans le forum Décisions SGBD
    Réponses: 15
    Dernier message: 27/04/2005, 09h07
  4. Réponses: 2
    Dernier message: 29/09/2004, 09h07
  5. Réponses: 7
    Dernier message: 08/03/2004, 15h30

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