Bonjours .
Je reprend l'aPI systeme ecrit en C sous linux. getaddrinfo(), comme je récupère une structure sa deviens un casse tête pour éviter le
warning: deprecated conversion from string constant to ‘char*’
sans compter l'erreur qui suis.
j'ai bien tenter un cast mai rien a faire sa ne veux rien savoir... comme je peux pas modifier le code de l'API je fait comment ??
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
 
#ifndef DEF_ME_NET
#define DEF_ME_NET
#include <iostream>
#include <string>
 
 
#include <stdio.h>
#include <string.h>
 
#include <netdb.h>
#include <arpa/inet.h>
 
 
#include <stdlib.h>
//#define _POSIX_C_SOURCE 2 /* Nécessaire sur certains Linux. */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
typedef const std::string csr;
class cNet  {
 
	public:
	cNet(){};
	csr GetIpFromHostname(csr & Hostname);
	private:
	csr flags(int f);    		// Affichage du champ ai_flags.
	csr family(int af);  		// Affichage du champ ai_family.
	csr socktype(int sock); 	// Affichage du champ ai_socktype.
	csr protocol(int p); 		// Affichage du champ ai_protocol.
	csr GetIp(struct addrinfo * ai);
 
 
};
 
#endif
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
 
#include "cGetHostnameIP.hpp"
// csr =  typedef const std::string csr;
csr cNet::GetIpFromHostname(csr & Hostname){
        char *hostname = "www.google.com", *service = NULL;
        struct addrinfo indices, *res;
        int error;
        memset(&indices, 0, sizeof(indices));
        indices.ai_flags = AI_CANONNAME;
        indices.ai_family = AF_UNSPEC;      // Adresse IPv4 ou IPv6.
        indices.ai_socktype = SOCK_STREAM;  // Socket connectee.
        if ((error = getaddrinfo(hostname, service, &indices, &res))) {
                if (error == EAI_SYSTEM) perror("  [getaddrinfo]");
                fprintf(stderr, "  [getaddrinfo] %s : %s\n", hostname,
                        gai_strerror(error));
                return "Erreur";
        }
 
 
        return res;
//        freeaddrinfo(res);
 
 
 
}
csr cNet::GetIp(struct addrinfo * ai){
     //int i = 0;
        char *ptr = NULL;
        int port = 0;                // Numero de port.
        char addr[INET6_ADDRSTRLEN]; // Adresse reseau.
 
        while (ai != NULL) {  // Parcours de la liste chainée.
              //  printf("  [%d] ",i++);
              //  print_family(ai->ai_family);     printf("(%d) ", ai->ai_addrlen);
              //  print_socktype(ai->ai_socktype); printf(" ");
               // print_protocol(ai->ai_protocol); printf("\n");
                // Récupération du numéro de port et de l'adresse IP.
                switch (ai->ai_family) {
                case AF_INET:  {
                        struct sockaddr_in *sin =
                                (struct sockaddr_in *) ai->ai_addr;
                        ptr = (char *) inet_ntop(AF_INET, &sin->sin_addr,
                                                 addr, sizeof(addr));
                        port = sin->sin_port;
                        break;     }
                case AF_INET6: {
                        struct sockaddr_in6 *sin6 =
                                (struct sockaddr_in6 *) ai->ai_addr;
                        ptr = (char *) inet_ntop(AF_INET6, &sin6->sin6_addr,
                                                 addr, sizeof(addr));
                        port = sin6->sin6_port;
                        break;     }
                }
				std::cout << "IP : " << addr << "Port" << port << std::endl;
				return addr;
              //  if (ptr != NULL) printf("\t@IP -> %s\t port : %d\n",addr,port);
               /* if (ai->ai_canonname != NULL)
                        printf("\tNom -> %s\n", ai->ai_canonname);*/
              //  ai = ai->ai_next; // On passe à l'élément suivant.
        }
		return "Erreur inconnue ";
}
csr cNet::flags(int fl){
	switch (fl) {
	case AI_PASSIVE:     	return "Passive"		; break;
	case AI_CANONNAME:   	return "Name"			; break;
	case AI_NUMERICHOST: 	return "Numeric host"	; break;
	default: return"%d Inconnu " +fl				;
	}
}
csr cNet::family(int fam){
	switch (fam) {
	case AF_INET:  			return "Inet"			; break;
	case AF_INET6: 			return "Inet6"			; break;
	case AF_LOCAL: 			return "Local"			; break;
	default: return "Inconnu : " + fam 				;
	}
}
csr cNet::socktype(int sock){
	switch (sock) {
	case SOCK_STREAM: 		return "Sock stream"	; break;
	case SOCK_DGRAM:  		return "Sock dgram"		; break;
	default: return "Inconnu " + sock				;
	}
}
csr cNet::protocol(int proto){
	switch (proto) {
	case IPPROTO_IP:   		return "Protocole ip"	; break;
	case IPPROTO_TCP:  		return "Protocole tcp"	; break;
	case IPPROTO_UDP:  		return "Protocole udp"	; break;
	case IPPROTO_RAW:  		return "Protocole raw"	; break;
	case IPPROTO_ICMP: 		return "Protocole icmp"	; break;
	default: return "Inconnu " + proto				;
	}
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
cGetHostnameIP.cpp: In member function ‘const csr cNet::GetIpFromHostname(const csr&)’:
cGetHostnameIP.cpp:4: warning: deprecated conversion from string constant to ‘char*’
cGetHostnameIP.cpp:19: error: conversion from ‘addrinfo*’ to non-scalar type ‘const csr’ requested
note: j'ai fait un typdef: // csr = typedef const std::string csr;
Merci d'avance