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. =-)