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 :

Server multiclients, accept() : Invalid argument


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 22
    Points : 11
    Points
    11
    Par défaut Server multiclients, accept() : Invalid argument
    Bonjour a tous,

    Je viens vers vous car j'ai une erreur incomprehensible, n'etant pas encore un expert des socket, je ne trouve pas la solution...

    J'ai creer un serveur en ecoute qui creer un thread par client. Malheursement, impossible de continuer car le accept merdouille...

    J'avais pourtant deja creer une version mono client qui marchait tres bien...

    Voila mon code, mon main appel la fonction megatalk.

    L'erreur est donc au niveau de l'accept qui me dit "accept() : Invalid argument"

    Les fonction "xsocket()" "xaccept()" etc sont juste des "socket()" "accept()" mais avec des verifications d'erreurs.

    st_client.h :

    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
     
    #ifndef ST_CLIENTS_H_
    #define ST_CLIENTS_H_
     
    #define MAX_SOCKET 5
     
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef const struct sockaddr SOCKADDR;
    typedef socklen_t SOCKLEN;
    typedef int SOCKET;
     
    typedef struct  st_clients
    {
      pthread_t     thread;
      SOCKET        sock;
      SOCKADDR_IN   sin;
      int           sin_size;
    }               st_clients;
     
    #endif /* ST_CLIENTS_H_ */
    megatalk.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void	                                megatalk(int server_port)
    {
      SOCKADDR_IN		sin;
      SOCKET		                sock;
     
      sock = xsocket(AF_INET, SOCK_STREAM, 0);
      init_socket(sock, &sin, server_port);
      clients(sock, server_port);
      printf ("closing socket %d...\n", sock);
      close(sock);
      printf ("The socket is now closing\n");
    }
    init_socket.c :

    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
     
    void	                   init_socket(SOCKET sock, SOCKADDR_IN *sin, int server_port)
    {
      struct protoent	   *proto;
     
      proto = getprotobyname("TCP");
      /* On creer le socket */
      sock = xsocket(AF_INET, SOCK_STREAM, proto->p_proto);
      printf ("socket %d is now opened in TCP/IP mode\n", sock);
      /* On remplit la struct du socket */
      sin->sin_family = AF_INET;
      sin->sin_port = htons(server_port);
      sin->sin_addr.s_addr = htonl(INADDR_ANY);
      /* On nome le socket (On lui attribue une adresse) */
      xbind(sock, (SOCKADDR *)sin, sizeof(*sin));
      xlisten(sock, 5);
      printf("Listening on port %d...\n", server_port);
    }
    clients.c :
    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
     
    void	                clients(SOCKET sock, int server_port)
    {
      st_clients	*s_client;
     
      while (42)
        {
          printf("waiting for a client connection on port %d...\n", server_port);
          s_client = my_xmalloc_bzero(sizeof(*s_client));
          s_client->sin_size = sizeof(s_client->sin);
          s_client->sock = xaccept(sock, (struct sockaddr *)&s_client->sin,
    			       (SOCKLEN *)&s_client->sin_size);
          printf("client connected with socket %d from %s:%d\n", s_client->sock,
    	     inet_ntoa(s_client->sin.sin_addr), htons(s_client->sin.sin_port));
          /* Thread creation */
          pthread_create(&s_client->thread, NULL, client_thread, s_client);
          s_client = NULL;
        }
    }
    Voila, j'espere que vous pourrez m'aider !

    En tout cas merci par avance, et si vous avez des commentaire sur le code (et a mon avis il doit y en avoir :p) dites le moi !

    Akiat.

    PS: Desole pour l'accentuation: clavier QWERTY...

  2. #2
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    Il me semble que cette erreur peut venir d'un problème de prototypage.
    As-tu essayer de faire cast explicite ? style xlisten(sock, (int)MAX_SOCKET);

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par fregolo52 Voir le message
    Il me semble que cette erreur peut venir d'un problème de prototypage.
    As-tu essayer de faire cast explicite ? style xlisten(sock, (int)MAX_SOCKET);
    Malheuresement ca ne marche pas non plus :/

    Et puis je n'ai jamais eu de probleme avec ca alors je ne vois vraiment pas

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Supprimer le ;
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par diogene Voir le message
    Supprimer le ;
    Hehe je venait sur le fofo pour poster ca justement, je me suis rendu compte de ma connerie tout a l'heure :p

    Merci bien.

    Par contre pas d'idee pour l'autre erreur ?

Discussions similaires

  1. Invalid argument supplied for foreach()
    Par Rajhonson dans le forum Langage
    Réponses: 4
    Dernier message: 16/11/2006, 14h31
  2. Réponses: 11
    Dernier message: 19/05/2006, 11h41
  3. Réponses: 26
    Dernier message: 24/03/2006, 13h44
  4. [Tableaux] Problème invalid argument foreach()
    Par kcizth dans le forum Langage
    Réponses: 9
    Dernier message: 05/01/2006, 11h56
  5. Invalid argument?
    Par Anduriel dans le forum Langage
    Réponses: 24
    Dernier message: 12/10/2005, 19h15

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