[C Réseau] Calculs binaires ! ahhhh - C Réseau

Hello !!!

Bon voilà, je dois calculer des adresses IP.
J’arrive à récupérer une adresse IP sur un entier long : 4 octets.
Et donc, je souhaiterais calculer l’adresse suivante.

Exemple : j’ai 192.168.0.1 => passage au format entier long sur 4 octets +> addition binaire +1 => repassage au format affichage => j’obtiens 192.168.0.2.

Comment on fait ? Pas mal de fonctions C utilisent le format entier long pour stocker les adresses IP ou MAC, donc je suppose que ca doit être facile à faire, mais moi je m’arrache les cheveux là. Je ne vois pas du tout.

Please HELP !!! Merci !

PS : 2nde étape, tester si l’adresse resultat est toujours dans mon réseau, en fonction de l’adresse réseau et de son masque.

tu dois te faire chier non? y a déjà des fonctions pour les ips (transformer ça en chaîne) etc.

-> http://www.chez.com/vidalc/lf/socket.html

Ca pourra t’aider.

:riva: Non non !

Je dois retrouver toutes les adresses IP existantes sur un réseau (en spécifiant adresse IP et masque) = En gros, construire une table ARP. Pour ca j’utilise les bibliothèques Libnet et Libpcap.

Donc en fait, j’envois sur le réseau des paquets ARP avec mes adresses recherchées. Ces adresses là, faut bien que je les calcules.

Si y’a moyen de faire plus simple, sachant que les fonctions de Libnet prenne des u_int32_t où un truc dans le genre. Enfin bref, ca doit être tout con, là solution que j’ai trouvé boucle à l’infinie :



long addbin( long a, long b ) {

int test = 0;

do {
  test = a;
  a ^= b;
  test != b;
  test <<= 1;
  b = test;
} while( test );

return a;

}

En gros : 192.168.0.* doit te renvoyer toute la plage d’IP 192.168.0.0 à 192.168.0.255 ? Ben normalement une IP ce ne sont que des entiers - non signés - tel que justement tu puisse faire un bête for dessus…

Tout à fait !

Mais je sais pas, j’y arrive pas. Je test derrière avec un analyseur de traffic, et mes adresses fabriquées sont toutes identiques ???

Je voulais faire un bête ip_dst = ip_dst + 1; Mais ca ne veut pas :neutre:

J’ai en gros … network est un u_long = 43200, ce qui doit correspondre à 192.168.0.0

A l’affichage, j’ai bien ip_dst qui est incrémenté. Mais dans mon analyseur (ethereal), les adresses fabriquées sont
193.168.0.0
194.168.0.0
195.168.0.0
196.168.0.0
197.168.0.0
198.168.0.0
199.168.0.0
200.168.0.0
201.168.0.0
202.168.0.0

J’y comprend rien, network n’est pas un tableau, donc ne pointe pas sur le premier élément du tableau.

tu decon mec la :wink:

sans-nom tu devien gentil ça m etonne que tu l’as pas pourri le type avec son histoire d’adresse a 2 balles (je me mets dans la peau de sans nom)

ton adresse c juste 4octects


#include <stdio.h>
#include <stdlib.h>

#define toa(a,b,c,d) ((((((unsigned long)a<<8)|b)<<8)|c)<<8)|d
#define moa(u,o) ((u&(0xFF<<((4-o)*8)))>>((4-o)*8))

int main(int argc, char *argv[])
{
  
  unsigned a;
  
  a=toa(192,168,0,0);
  printf("%u\n",a);
  printf("%d\n",moa(a,1));
  printf("%d\n",moa(a,2));
  printf("%d\n",moa(a,3));
  printf("%d\n",moa(a,4));
  
  system("PAUSE");	
  return 0;
}

Oui, merci pour la soluce.

C’est comme ça que je faisais au départ, mais ca inclus une transformation <adresseIP int> => <adresseIP tab> => incrémentation => <adresseIP int> que je ne veux pas.

Le but de l’exercice n’est pas de fabriquer des adresses. Seulement je ne veux pas que ce soit de la bidouille. Donc en fait, grâce à pcap_lookupdev je récupère le nom de mon interface réseau, ensuite, grâce à pcap_lookupnet je récupère l’adresse du réseau et son masque associé à l’interface, sous forme de long non signé apparemment.

Je dois faire un programme qui récupère toutes les adresses MAC correspondant aux adresses IP des machines connectées au réseau, comme sur les interfaces web des routeurs, où l’ont voit les machines connectées avec NOM, IP, MAC.

Si y’a un autre moyen de recevoir ces infos, autrement qu’en fabriquant des adresses IP, tout en utilisant le protocole ARP, je suis preneur.

Franchement, c’est pas parce qu’on manipule des trucs qui peuvent être malhonnête, qu’on souhaite le faire. C’est pas le but de mon programme de pourrir un PC par le réseau.

tu veux faire un scanner d’ip … en gros

ya pas 36 moyen de faire ça y a en gros 2 techniques

soit tu fait un sniffeur de paquet qui recupere tous les paquets qui passe sur le reseau et tu recupere les IP du paquet

soit tu genere des IP et tu test avec different protocole/reponse les IP generes

bon on attend ton code avec impatience :stuck_out_tongue:

ps : transformer une ip en unsigned c pas de la bisouille c juste un format plus facile a utiiser !

Oui, j’ai opté pour la seconde solution, car plus rapide à l’execution (j’attend des réponses à des paquets que j’ai envoyé).

Ca marche bien pour le moment, sauf que j’ai fait :

char ip_src[4] = { 192, 168, 0, 0 };

et puis dans ma boucle d’envoi de paquets, j’incrémente : ip_src[3]++;
Sauf que l’ip du réseau n’est pas récupérer automatiquement (ce que j’aimerais), et ca ne prend pas du tout en compte le masque du réseau (bah oui, je fais une bête boucle de 0 à 254, et je stoppe => c’est pour faire tourner le prog, sinon ca marche pas).

Voilà, comme j’arrive à récupérer les adresses réseau et masque sous forme de unsigned long, j’aimerais bien pouvoir faire des opérations binaires dessus : incrémenter de 1 l’adresse, tester avec le masque avec un ET ou OU logique (je sais plus), etc …

Je pense que c’est faisable, mais je ne sais pas comment m’y prendre, enfin si je sais, mais ca marche pas. :??:

Ben une adresse IP, un masque, c’est un nombre 32 bits, la représentation A.B.C.D est juste plus pratique à utiliser.
Bon bref:
Soit N l’adresse de ton réseau (192.168.0.0 par exemple, ce qui nous donne en hexa sur 32 bits c0a80000).
Soit M le masque (255.255.252.0 par exemple, ce qui nous donne en binaire 11111111.11111111.11111100.00000000; j’ai volontairement pris autre chose que 255.255.255.0).

Pour trouver la liste des adresses IP valides pour ton réseau, tu fais une boucle avec I allant de 1 à (!M - 1).

edit: on part de 1 car avec I=0 c’est le numéro du réseau, avec !M on obtient l’adresse de broadcast.

Pour chaque I tu fais ADRESSE=N | I.

Pour mon exemple, ça ira de 192.168.0.1 à 192.168.3.254.

Pour les tatillons je sais que 192.168.0.0, c’est du /24 normalement :oui:

edit 2: tu peux utiliser inet_ntoa() pour obtenir une représentation de type A.B.C.D des adresss obtenues.

edit 3: tout mon charabia vaut peau d’balle appliqué à IPv6 :paf:

Je vous tiens au courant dès que j’ai quelque chose qui fonctionne !