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

Réseau C Discussion :

Sockets et flux en général


Sujet :

Réseau C

  1. #1
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut Sockets et flux en général
    Bonjour à tous,

    Cela fait quelque jours que j'apprends à me servir des sockets pour réaliser deux mini-applications (client/serveur). J'utilise le mode de transfert TCP et mon serveur est "multi-threadé". Tout fonctionne nickel pour l'instant (je n'ai pas encore effectué les modifications nécessaires pour la portabilité sous Windows, donc pour l'instant c'est fonctionnel sous Linux et Mac OS X uniquement). J'aimerais cependant améliorer certains points et obtenir certaines informations.

    J'ai remarqué (même si je sais que c'est normal) que lorsque j'utilise read() sur un flux, si rien n'est reçu le temps d'expiration est assez long. Je pensais me servir de setsockopt() mais les paramètres contrôlant ce temps d'expiration (SO_SNDTIMEO et SO_RCVTIMEO) ne sont pas modifiables d'après ce site de référence. Du coup la seule solution que je vois pour raccourcir moi-même ce temps serait de limiter le temps d'exécution de cette fonction grâce à SIGALRM, mais je ne trouve pas ça très propre. Y a-t-il une autre solution ?

    Sinon je me demandais s'il y avait une différence entre utiliser read()/write() pour les flux sur le réseau et recv()/send(). J'ai vu que ces deux dernières fonctions peuvent prendre un 4e argument mais je ne m'en sers jamais. J'ai voulu l'utiliser une fois lorsque je ne comprenais pas pourquoi j'obtenais un SIGPIPE chez le serveur quand le client interrompait la connexion et l'argument MSG_NOSIGNAL m'aurait peut-être servi s'il existait sur mon OS... je n'ai pas trouvé la définition de la constante alors qu'elle devrait normalement être dans /usr/include/sys/socket.h il me semble. Donc pour en revenir à read()/write() et recv()/send(), y a-t-il une différence ?

    Et enfin dernier point, est-il possible d'utiliser en simultané le même flux par deux threads distincts, l'un s'occupant de la lecture et l'autre de l'écriture ? Je doute très franchement que cela soit faisable mais je préfère m'en assurer. J'ai envisagé cette solution car je cherche à permettre à l'utilisateur de se servir du logiciel tout en ayant en fond la connexion et les envois/réceptions au serveur. Je trouve gênant de ne pas pouvoir envoyer d'informations simplement parce que je surveille aussi l'arrivée de requêtes ou d'autres informations. Je ne sais pas comment est organisé l'envoi et la réception des données sur ce genre de logiciels, donc si vous avez des avis sur ce point, je suis preneur .

    Merci pour votre aide,
    Spootnik

  2. #2
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    Y a-t-il une autre solution ?
    oui, la séléction ou le polling
    man select où man poll (et en plus c'est portable) ... et avec ça tu peux même te passer de threads
    (faut que je finisse mon article moi )

    Donc pour en revenir à read()/write() et recv()/send(), y a-t-il une différence ?
    le dernier argument ne sers en général pas sur recv/send (fin, pas en AF_INET)
    la différence majeure entre read/write et send/recv ... c'est que les 2 derniers font parti de l'API socket ... et sont donc plus approprié.
    certains OS n'ont pas de fonction read/write fonctionnelle sur des sockets.
    disons que read/write c'est la maniére unix/linux ... et recv/send c'est la maniére portable

    est-il possible d'utiliser en simultané le même flux par deux threads distincts, l'un s'occupant de la lecture et l'autre de l'écriture ?
    oui, c'est tout à fait possible, et sans aucune précaution particulière.

    sinon, y'as un forum prévut pour les questions dans ce genre
    developpement réseau

  3. #3
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Salut, je vais essayer de te répondre \o/
    Citation Envoyé par Spootnik Voir le message
    J'ai remarqué (même si je sais que c'est normal) que lorsque j'utilise read() sur un flux, si rien n'est reçu le temps d'expiration est assez long. Je pensais me servir de setsockopt() mais les paramètres contrôlant ce temps d'expiration (SO_SNDTIMEO et SO_RCVTIMEO) ne sont pas modifiables d'après ce site de référence. Du coup la seule solution que je vois pour raccourcir moi-même ce temps serait de limiter le temps d'exécution de cette fonction grâce à SIGALRM, mais je ne trouve pas ça très propre. Y a-t-il une autre solution ?
    Pour ça rien ne vaut select . Tu sais régler un timeout comme bon te semble donc je pense que c'est ce que tu veux.
    Et en effet, faire celà avec SIGALRM quand on a une sexy function comme select c'est pas très M. propre :>

    Citation Envoyé par Spootnik Voir le message
    Sinon je me demandais s'il y avait une différence entre utiliser read()/write() pour les flux sur le réseau et recv()/send(). J'ai vu que ces deux dernières fonctions peuvent prendre un 4e argument mais je ne m'en sers jamais. J'ai voulu l'utiliser une fois lorsque je ne comprenais pas pourquoi j'obtenais un SIGPIPE chez le serveur quand le client interrompait la connexion et l'argument MSG_NOSIGNAL m'aurait peut-être servi s'il existait sur mon OS... je n'ai pas trouvé la définition de la constante alors qu'elle devrait normalement être dans /usr/include/sys/socket.h il me semble. Donc pour en revenir à read()/write() et recv()/send(), y a-t-il une différence ?
    Je pense que la seule différence réside dans le fait que send/recv sont "mieux adaptées" aux Léctures/Ecritures sur le réseau, j'entend par là le fait d'avoir un flag en plus, par rapport à read/write, qui permet de gérer certains aspects de la socket, comme le oob et tout ça.
    Personnellement j'utilise toujours send/recv mais je vois souvent des read/write partout

    Citation Envoyé par Spootnik Voir le message
    Et enfin dernier point, est-il possible d'utiliser en simultané le même flux par deux threads distincts, l'un s'occupant de la lecture et l'autre de l'écriture ? Je doute très franchement que cela soit faisable mais je préfère m'en assurer. J'ai envisagé cette solution car je cherche à permettre à l'utilisateur de se servir du logiciel tout en ayant en fond la connexion et les envois/réceptions au serveur. Je trouve gênant de ne pas pouvoir envoyer d'informations simplement parce que je surveille aussi l'arrivée de requêtes ou d'autres informations. Je ne sais pas comment est organisé l'envoi et la réception des données sur ce genre de logiciels, donc si vous avez des avis sur ce point, je suis preneur .
    Biensûr que si, c'est tout à fait possible. Dans un socket, tu as, si j'ose dire, deux sorte de "canaux" celui de lécture et celui d'écriture.
    Le seul truc c'est que pour la lécture y'a pas de soucis N threads peuvent lire dessus, par contre pour l'écriture, si tu envisages avoir un facteur externe exécutant une écriture sur la socket pense à mettre en place une mutex.
    Mais si tu n'as qu'un seul thread qui écrit tu peux y aller les yeux fermer.

    Voilà, si je me suis gouré quelque part qu'on me corrige

    Edit: GRILLED
    Compil your life guy!
    The Aures Project

  4. #4
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    Citation Envoyé par Dark_Ebola
    oui, la séléction ou le polling
    man select où man poll (et en plus c'est portable) ... et avec ça tu peux même te passer de threads
    Code Terminal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    man poll
    No manual entry for poll

    par contre pour select j'ai plein d'infos et ça à l'air de correspondre merveilleusement bien à ce que je cherchais .

    Citation Envoyé par Dark_Ebola
    le dernier argument ne sers en général pas sur recv/send (fin, pas en AF_INET)
    la différence majeure entre read/write et send/recv ... c'est que les 2 derniers font parti de l'API socket ... et sont donc plus approprié.
    certains OS n'ont pas de fonction read/write fonctionnelle sur des sockets.
    disons que read/write c'est la maniére unix/linux ... et recv/send c'est la maniére portable
    C'est noté !

    Citation Envoyé par Dark_Ebola
    oui, c'est tout à fait possible, et sans aucune précaution particulière.
    Cool...

    Et pour le forum sur le réseau je sens que je vais m'en imbiber , merci pour toutes ces infos.

    Citation Envoyé par Goundy
    Je pense que la seule différence réside dans le fait que send/recv sont "mieux adaptées" aux Léctures/Ecritures sur le réseau, j'entend par là le fait d'avoir un flag en plus, par rapport à read/write, qui permet de gérer certains aspects de la socket, comme le oob et tout ça.
    oob ?

    Citation Envoyé par Goundy
    Biensûr que si, c'est tout à fait possible. Dans un socket, tu as, si j'ose dire, deux sorte de "canaux" celui de lécture et celui d'écriture.
    Le seul truc c'est que pour la lécture y'a pas de soucis N threads peuvent lire dessus, par contre pour l'écriture, si tu envisages avoir un facteur externe exécutant une écriture sur la socket pense à mettre en place une mutex.
    Mais si tu n'as qu'un seul thread qui écrit tu peux y aller les yeux fermer.
    Je n'aurai qu'une seule écriture à la fois donc je suis tranquille .

    Sinon merci pour ton aide (même grillé).

    Je ne pensais pas avoir toutes les réponses à mes problèmes aussi vite, quand je pense que ça fait 3 jours que je demandais de l'aide sur un autre forum ... sans aucune réponse (enfin c'est plutôt un forum pour débutants, je saurai où poster pour des questions plus techniques à l'avenir ).

  5. #5
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Compil your life guy!
    The Aures Project

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    poll() est plutôt Linux. select(), plutôt UNIX, et pselect() est POSIX.1.

    En fait, les 3 sont POSIX.1

    http://www.opengroup.org/onlinepubs/...ions/poll.html
    http://www.opengroup.org/onlinepubs/...ns/select.html
    http://www.opengroup.org/onlinepubs/...s/pselect.html

    après, chaque implémentation fait ce qu'elle veut...

  7. #7
    Membre très actif Avatar de clampin
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 96

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par Goundy Voir le message
    Bien sûr que si, c'est tout à fait possible. Dans un socket, tu as, si j'ose dire, deux sorte de "canaux" celui de lecture et celui d'écriture.
    Oui, mais sont-ils parfaitement indépendants?

    Citation Envoyé par Goundy Voir le message
    Le seul truc c'est que pour la lecture y'a pas de soucis N threads peuvent lire dessus,
    Tu veux dire : plusieurs threads peuvent lire sur la même socket en même temps, sans synchronisation d'aucune forme?

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par corrector Voir le message
    Oui, mais sont-ils parfaitement indépendants?
    Oui, c'est le principe du 'full duplex'.

    C'est au-dessus qu'éventuellement un protocole fait la régulation de flux avec des acquittements...
    Tu veux dire : plusieurs threads peuvent lire sur la même socket en même temps, sans synchronisation d'aucune forme?
    Non.

    Dans un serveur, il y a un socket serveur et un socket par client. En principe, il y a un thread par client qui utilise évidemment son socket client.

    Il peut y avoir d'autres architectures basées sur select(), voire sur une combinaison thread+select()....

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Oui, c'est le principe du 'full duplex'.
    Mais si les deux threads veulent lire l'état d'erreur de la socket avec getsockopt (... SO_ERROR ...) ils vont interférer, non?

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

Discussions similaires

  1. socket et flux continue
    Par topolino dans le forum Développement Windows
    Réponses: 3
    Dernier message: 25/07/2014, 09h03
  2. [flux/socket]probleme client
    Par xelif dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 12/01/2014, 21h35
  3. [Socket] Problème de lecture flux danss communication
    Par tooney dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 06/06/2005, 11h08
  4. [Réseau] plusieurs flux a partir d'une socket
    Par al85 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 27/01/2005, 18h11
  5. Flux et Socket
    Par Le_Tolier dans le forum Développement
    Réponses: 2
    Dernier message: 07/07/2004, 21h20

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