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 :

Serveur IPV6 bind: invalid argument (EINVAL)


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Septembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 11
    Points : 13
    Points
    13
    Par défaut Serveur IPV6 bind: invalid argument (EINVAL)
    Bonjour,

    Je vien demander de l'aide dans ce forum car je suis en train de programmer un serveur qui fonctionne avec IPV6.
    Après avoir trouvé de nombreux exemple, j'ai créé le mien qui est tout simple et qui pourtant ne fonctionne pas.

    Le problème vien de l'appel à l'appel système bind(). il me retourne l'erreur "invalid argument", qui correspond par ailleur au code errno EINVAL.

    voicie mon code qui est non fonctionnel, il est compilé sous linux avec gcc:

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <arpa/inet.h>
    #include <errno.h>
     
     
    #define PORT	4000
    //#define	IP_LO			"::1"
    //#define	IP_SERV 		"fe80::2c0:caff:fe32:3de5"
     
     
    int main()
    {
    	char ip[50];
    	char HostName[100];
     
    	struct sockaddr_in6 from;
    	struct sockaddr_in6 server;
    	struct addrinfo hints, *res;
    	struct sockaddr_in6 *extract;
     
    	int sockS=0, sockC=0;
    	int ecode=0;
    	socklen_t len =  sizeof(server);
    	void *addr = NULL;
     
     
    	memset( &ip, 0, sizeof(ip) );
    	memset( &hints, 0, sizeof hints );
    	memset( &HostName, 0, sizeof(HostName) ); 
    	memset( &from, 0, sizeof(struct sockaddr_in6) );
    	memset( &server, 0, sizeof(struct sockaddr_in6) );	
     
    			// récupére l'IP de la machine
    	if(gethostname( HostName, sizeof(HostName) ) == -1)
    	{
    		perror("gethostname");
    		exit(1);
    	}
     
    	hints.ai_socktype = SOCK_STREAM;
    	hints.ai_family = PF_INET6;
     
            if((ecode = getaddrinfo(HostName, NULL, &hints, &res)) != 0) 
    	{
    		fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ecode));
    		exit(1);
            }
     
    	extract = (struct sockaddr_in6 *)res->ai_addr; 
    	addr = &(extract->sin6_addr);
     
    	inet_ntop(PF_INET6, addr, ip, sizeof(ip));
     
     
    			/*	remplie la structure du server	*/
    	server.sin6_family = PF_INET6;
    	server.sin6_port = htons(PORT);
    	server.sin6_flowinfo = 0;
     
    	if( (ecode = inet_pton(PF_INET6, ip, &(server.sin6_addr))) == 1 )
    	{
    		puts(" :: IP OK ::");
    	}
    	else
    	{
    		puts(" :: Invalid Adresse or Adresse family ::");	
    	}
     
    /* debugage: affiche bien l'adresse IPV6 de ma machine */
    inet_ntop(PF_INET6, &(server.sin6_addr), ip, INET6_ADDRSTRLEN);
    printf("::<%s>::\n", ip);
     
     
    			/*	construit le serveur	*/
    	if((sockS = socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP)) == -1) 
    	{
    		perror("socket");
    		exit(1);
    	}
     
    	if(bind(sockS,  (struct sockaddr*)&server, sizeof(server)) != 0)
    	{		
    		perror("bind");
    		exit(1);
    	}
     
    	if( listen(sockS, 4) == -1)
    	{
    		perror("listen");
    		exit(1);
    	}
     
    	if( (sockC = accept(sockS, (struct sockaddr *)&from, &len)) == -1)
    	{
    		perror("accept");
    		exit(1);
    	}
    	else	puts("connection OK");
     
     
    	return 0;
    }
    Je n'ai pas trouvé de réponse sur d'autre forum, voilà pourquoi je me tourne vers vous.

    Je pense que j'ai fais une grossière erreur pourtant je trouve rien qui cloche au niveau du code. Je précise par ailleur que ce serveur marche très bien lorsque je tente de lié à l'interface local que j'ai mis en haut "#define IP_LO "::1"".


    Merci d'avance de votre aide. =-)

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mai 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2013
    Messages : 42
    Points : 80
    Points
    80
    Par défaut salut,
    Il y a deux sources d erreurs dans ce cas :

    1. Le troisieme argument de bind() est faux . addrlen .

    2. Le socket ne fait pas partir de la famille AF_UNIX .

    3. Sinon essaye un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    server.sin6_scope_id = 5;
    Je pencherai plus pour le 3.
    Essaye en premier lieu le 3, apres le 2.

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