[programmation C] IPV6 bind: invalid argument (resolu)
Publié : jeu. 30 mai 2013, 12:32
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 exemples, 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:
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. =-)
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 exemples, 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 : Tout sélectionner
#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. =-)