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 :

2 threads sur un même socket


Sujet :

Réseau C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 42
    Points : 28
    Points
    28
    Par défaut 2 threads sur un même socket
    Bonjour,
    J'ai besoin d'un programme avec un unique socket où un thread écrit sur le socket et un deuxième thread lit depuis le socket, les deux fonctionnants en continu et de manière asynchrone.
    Je souhaiterai savoir s'il faut mettre un mutex sur le socket, ou si le noyaux s'occupe déjà d'empêcher les accès concurrents.

    Merci d'avance!

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je ne pense pas qu'il n'y ai de problème à faire comme vous faites.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    il faut tout de même sérialiser les opératons de lecture / écriture entre les deux threads..
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    D'accord merci.
    Que signifie sérialiser ?

  5. #5
    Membre du Club Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par atmakefka Voir le message
    Que signifie sérialiser ?
    En gros enchainer les recv/send/recv/send
    Membre actif de la Pouy@geTe@m.

  6. #6
    Membre habitué Avatar de keikoz
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 146
    Points : 173
    Points
    173
    Par défaut
    Si t'utilises les threads, c'est bien pour avoir une lecture/écriture synchrone sur le socket non ?

    J'avais utilisé les threads pour faire un truc dans le genre, je sais pas si ça correspond à ce que tu veux. Un truc que j'ai fais à mes débuts. Des doutes, des erreurs sans doute, mais en tout cas ça marchait: lecture et écriture sur la socket, via des threads séparés. Voilà l'essentiel du code :

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pthread.h>
    #include <netdb.h>
    #include "commands.h"
    #include "irc.h"
    #include "kbot.h"
    #include "files.h"
     
     
    /* Initialisation des fonctions */
    void *write_funct(void *arg);
    void *read_funct(void *arg);
     
     
    /* Variables globales. Est-ce mal ? Les buffers sont utilisés tout au long
     * de la connexion ... */
    int Cli_Sock;
    char wBuffer[MAX_BUFFER];
    char rBuffer[MAX_BUFFER];
    pthread_t read_thread, write_thread;
     
     
    int main(int argc, char *argv[])
    {
      int Serv_Port;
      struct sockaddr_in Serv_Addr;
      struct hostent *Server;
     
     
      /* On vérifie que la commande est utilisée correctement */
      if (argc != 3) {
        fprintf(stderr,"Usage: kbot hostname port\n");
        exit(1);
      }
      else {
        Serv_Port = atoi(argv[2]);
        if (Serv_Port < 1 || Serv_Port > 65355) {
          fprintf(stderr, "Invalid port\n");
          exit(1);
        }
      }
     
     
      /* Appel du fichier de configuration */
      conf_file_open();
     
     
      /* On créé l'adresse serveur avec les paramètres de connexion */
      Server = gethostbyname(argv[1]);
      Serv_Addr.sin_family = AF_INET;
      Serv_Addr.sin_port = htons(Serv_Port);
      memcpy(&Serv_Addr.sin_addr.s_addr, Server->h_addr, Server->h_length);
     
     
      /* On établi le socket (pourquoi AF_INET et pas PF_INET ?) */
      Cli_Sock = socket(AF_INET, SOCK_STREAM, 0);
      if (Cli_Sock < 0) {
        fprintf(stderr,"Erreur lors de la création du socket\n");
        exit(1);
      }
     
     
      /* On établit la connection sur le socket */
      if(connect(Cli_Sock, (struct sockaddr*) &Serv_Addr, sizeof(Serv_Addr))!= 0) {
        fprintf(stderr,"Erreur lors de la connection\n");
        exit(1);
      }
     
     
      /* Threads (écriture, lecture) */
      pthread_create(&write_thread, NULL, write_funct, NULL);
      pthread_create(&read_thread, NULL, read_funct, NULL);
     
     
      /* On rejoint les thread lors de leur fin d'exécution) */
      pthread_join(write_thread, NULL);
      pthread_join(read_thread, NULL);
     
      return 0;
    }
     
     
    /* fonctions d'écriture/lecture dans le socket */
    void *write_funct (void *arg)
    {
      /* Modules */
      auth();
     
      /* Boucle: Processus d'écriture */
      while (1) {
        memset(wBuffer, 0, MAX_BUFFER);
        fgets(wBuffer, MAX_BUFFER-1, stdin);
     
        commands();
     
        if (write(Cli_Sock, wBuffer, strlen(wBuffer)) < 0)
          fprintf(stderr,"Error writing to socket\n");
      }
      return(0);
    }
     
    void *read_funct (void *arg)
    {
      while (1) {
        int n;
     
        memset(rBuffer,0, MAX_BUFFER);
        n = recv(Cli_Sock, rBuffer, MAX_BUFFER, 0);
     
        /* Situation d'écriture normale */
        if (n > 0) {
     
          /* Ecriture sur stdout */
          printf(">%s", rBuffer);
     
          /* Modules */
          on_ping();
     
        }
     
        /* Cas erreur */
        else if (n < 0) 
          fprintf(stderr,"Error reading from socket\n");
     
        /* Fermeture du socket distant */
        else if (n == 0) {
          if (close(Cli_Sock) != 0)
    	fprintf(stderr, "Could not close the socket\n");
          printf("Fin de la connection\n");
          pthread_exit(&read_thread);
        }
     
      }
      return(0);
    }

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/05/2008, 16h30
  2. Lecture et écriture sur une même socket ?
    Par nico_ayci dans le forum Réseau
    Réponses: 2
    Dernier message: 19/05/2008, 07h17
  3. [Socket&Stream] Plusieurs streams sur une même socket
    Par Napalm51 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 15/11/2007, 15h40
  4. plusieurs readLine en même temps sur un même socket
    Par eracius dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 05/10/2007, 10h16
  5. 2 inputs sur la même socket
    Par Goduak dans le forum Entrée/Sortie
    Réponses: 15
    Dernier message: 13/03/2007, 19h22

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