Bonjour,

J'ai effectué pas mal de recherches (notamment sur ce forum) et trouvé bon nombres de références à mon problème mais je bloque toujours sur la conversion d'une adresse IP saisie par l'utilisateur vers son utilisation par libnet.

Le format d'entrée est un std::string et libnet utilise des pointeurs uint8_t pour manipuler les adresses.

Comme c'est un problème que je rencontre fréquemment, je me suis créé une classe pour gérer les adresses IP et MAC.

La fonction incriminée est inspirée d'un code trouvé sur ce forum :
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
ADDRESS::ADDRESS(const string &addr)
{
	string byte[8]; 
	istringstream iss;
	int nb_sep = 0;
	uint16_t value = 0; // maximum 2 octets dans le cas ipv6
	uint32_t ipv4 = 0;
 
	// split des octets dans un tableau (type string)
 
	for( size_t i=0; i<addr.size(); i++ )
	{
		if( nb_sep > 7 ) // le tableau d'octet ne permet pas de gerer plus de 8 elements (une IPv6)
			throw BadFormat(); 
		if( isxdigit(addr[i]) )
			byte[nb_sep] += addr[i];
		else if( addr[i] == '.' || addr[i] == ':' )
			nb_sep++;
		else
			throw BadFormat();
	}
 
    // traitement en fonction du type d'adresse
 
    switch(nb_sep)
    {
		case 3: // 3 separateurs pour une IPv4
			this->type = IPv4;
			for( int i=0; i<=nb_sep; i++ )
			{
				value = atoi( byte[i].c_str() ); // conversion en entier
				//cout << "IP/ i: " << i << " byte[i]: " << byte[i] << " value: " << value << endl;
				ipv4 += (value << (i*8)); // processeur little endian (intel)
				//ipv4 += (value << (24-(i*8))); // processeur big endian (sparc)
			}
			cout << "IP ipv4 (int): " << ipv4 << endl;
			this->address = (uint8_t *) &ipv4;
			break;
 
		case 5: // 5 separateurs pour une MAC
			this->type = MAC;
			cout << "A venir\n";
			break;
 
		case 7: // 7 separateurs pour une IPv6 complete
			this->type = IPv6;
			cout << "IPv6 non implemented yet !\n";
			break;
 
		default:
			throw BadFormat();
	}
}
Cette fonction lit octet par octet l'adresse envoyée et détecte le format (IPv4, Mac ou IPv6) en fonction du nombre d'éléments. Ensuite, un traitement spécifique est mis en oeuvre. Pour le moment je bloque sur IPv4.

En testant cette fonction avec "ADDRESS(192.168.0.1)", j'obtiens :
IP ipv4 (int): 16820416
Ce qui correspond bien à : "1×256^3+168×256+192"

Pourtant, lors de l'injection wireshark me retourne une addresse en 160.81.222.9

Si je hardcode cette même adresse avec sa représentation hexadécimale "\xc0\xa8\x00\x01\x00" et que je déclare un pointeur uint8_t dessus, l'injection est alors correcte.

J'avoue avoir beaucoup de mal à débugger ce problème qui, à mon avis vient de là :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
this->address = (uint8_t *) &ipv4;
Si quelqu'un à une idée, je suis preneur.