EMule, eDonkey : Calculer l' IP à partir de l'ID et vise vers ca.

cs_AMokers Messages postés 83 Date d'inscription jeudi 18 juillet 2002 Statut Membre Dernière intervention 8 octobre 2008 - 23 déc. 2003 à 00:00
cs_AMokers Messages postés 83 Date d'inscription jeudi 18 juillet 2002 Statut Membre Dernière intervention 8 octobre 2008 - 23 déc. 2003 à 20:47
Salut à tous !
Voila je souhaiterais faire un convertisseur qui converti un ID en Ip ou vise vers ca.

Voici la procedure de l'id vers l'ip :

Par exemple j'ai une IP fixe: 62.4.18.116. Mon ID est TOUJOURS le même: 1947337790. 

Vous allez me dire, pkoi c'est toujours 1947337790 et pas un autre? pkoi quand je suis déconnecté d'Edonkey quelqu'un d'autre ne prend pas mon ID à ma place?... 

Et bien tout simplement parce que c'est mon IP justement et qu'elle est fixe ... 

Regardez plutôt: 

1947337790 (en décimal) = 7412043E (en héxadécimal) 

Groupons mon ID par blocs de 2 digits: 74.12.04.3E 

Maintenant inversons le: 3E.04.12.74 

Convertissons chaque bloc hexa en décimal à nouveau: on tombe sur.... 62.4.18.116 !! MAGIQUE

Evidemment, les personnes dont l'IP est dynamique, c'est différent: lorsque vous changez d'IP, la personne qui prend votre ancienne IP aura votre ancien ID... Ca explique pkoi dans votre liste de "Friends" vous entrez un jour une personne, et 3 semaines plus tard, ce n'est plus le même nick qui apparaît!!! forcément, même ID, mais personne différente... Là encore ça n'arrive que pour les IP dynamiques: moi par exemple comme je suis la seule personne au monde à avoir mon IP, si vous m'ajoutez dans votre Friend List, ce sera toujours mon nick qui apparaît... 

Maintenant prenons l'exemple d'une personne avec un LowID! souvenez-vous ma FAQ: le serveur alloue une IP virtuelle de type "107.0.0.0" si c'est le 107e connecté.. et bien on fait le même principe mais vous voyez tout de suite que la conversion en hexa, l'inversion, puis la conversion encore en décimal va donner un tout petit chiffre! ... et bien voilà... quand vous changez de serveur, votre numéro de file change, donc l'IP virtuelle attribuée par le serveur change aussi, donc le calcul donne un ID lui aussi différent, d'où le fameux message "Your ID has changed, you've been removed from all upload queue" .. Logique: ID différent = utilisateur différent pour eDonkey... donc tout repart à zero. CQFD. 

Là vous allez me dire, le N-ième connecté avec un LowID sur un serveur A et sur un serveur B vont avoir le même ID alors?... et bien non, car le serveur est lui aussi identifié de manière unique sur le réseau, et donc il ajoute cette information dans le calcul, ce qui fait que les ID sont différents d'un serveur à l'autre.. mais là j'avoue je n'ai pas vraiment cherché la formule (car j'ai pas de LowID justement..) 


Voila maintenant voici mon code :

Il bug ca m'ennerve :( est ce que quelq'un veux bien regarder, modifier ou bien carement refaire le projet ?

Merci

function InverseStr(sDep: String): String;
var
sFin: String;
i: Integer;
  begin
    sFin := '';
    i := Length(sDep);

    // if Length(sDep) mod 2 <> 0 then Exit; // ici filtrage
  //(Exit ou autre instruction, c'est toi qui vois...)
  while i <> 0 do
  begin
    sFin := sFin + Copy(sDep, i - 1, 2);
    Dec(i, 2);
  end;
Result := sFin;
end;

procedure TFmain.IdToIpClick(Sender: TObject);
begin
  HID := IntToHex(StrToInt(ID.Text),2);
    Log.Lines.Add(HID);
  Temp := InverseStr(HID);
    Log.Lines.Add(Temp);
    //Log.Lines.Add(IntToStr(StrToInt('$'+Copy(Temp,1,2))));
    Log.Lines.Add(Temp);
    IpA.Text := IntToStr(StrToInt('$'+Copy(Temp,1,2)));
    IpB.Text := IntToStr(StrToInt('$'+Copy(Temp,3,4)));
    IpC.Text := IntToStr(StrToInt('$'+Copy(Temp,5,6)));
    IpD.Text := IntToStr(StrToInt('$'+Copy(Temp,7,8)));
end;

4 réponses

japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
23 déc. 2003 à 00:43
Peut-être un peu tard pour moi pour te donner un coup de main, AMokers, mais bon...
1) où sont les variables etc... dans la procedure "TFmain.IdToIpClick(Sender: TObject);" ?
(et Log.Lines, c'est une TStringList, ou quoi ?)
2) Où ça bugge, et comment ?
Désolé, mais là c'est pas très clair.
Avec un peu plus de code, ça devrait pouvoir se résoudre ;)
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
23 déc. 2003 à 17:54
Comme je te le disais, je préfère publier ma réponse sur ce forum, dans la mesure où j'ai une solution, et bon, le problème étant posé ici...
Je reproduis le petit bout de code que tu m'as envoyé, car celui que tu publies plus haut est erronné, tu as d'ailleurs toi-même corrigé l'erreur.
Voici ton code :

procedure TFmain.IdToIpClick(Sender: TObject);
begin
{ Ca bug :/ par exemple si l'ip est egual a 0 ex : 127.0.0.1
  Comment définir si le bloc A de l'ip (IpA) est égual a 1,2 ou 3 chiffres ?
  Idem pour IpB, IpC, IpD}
temp := '';
  HID := IntToHex(StrToInt(ID.Text),2); // <- problème éventuel
  Temp := InverseStr(HID);
  Edit1.Text := HID;
  Edit2.Text := Temp;
    IpA.Text := IntToStr(StrToInt('$'+Copy(Temp,1,2)));
    IpB.Text := IntToStr(StrToInt('$'+Copy(Temp,3,2))); // *
    IpC.Text := IntToStr(StrToInt('$'+Copy(Temp,5,2))); // *
    IpD.Text := IntToStr(StrToInt('$'+Copy(Temp,7,2))); // *
end;

// (* erreurs que tu as toi-même corrigées)


Je te conseille seulement de remplacer :

HID := IntToHex(StrToInt(ID.Text),2);


par :

HID := IntToHex(StrToInt(ID.Text), 8);


afin d'éviter un erreur possible dans le calcul de IpD.Text, IpC.Text, voire IpB.Text, si le n° d'ID à convertir en IP est fantaisiste ;)

Ton inquiétude quand à la définition de la longueur de chaque bloc d'IP n'est pas fondée. Dans la mesure où tu traites 4 blocs hexdécimaux, la valeur en integer sera forcément correcte pour chacun de ces blocs, sans que tu n'aies besoin de te préoccuper de la longueur (1, 2 ou 3 chiffres).

Donc, pas de bug grave constaté, AMokers...
Tu t'es affolé un peu vite, il faut décrisper, lol ;)

Bonne prog' :-p

japee
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
23 déc. 2003 à 18:07
Pardon, c'est moi qui rajouté

Edit1.Text := HID;
Edit2.Text := Temp;


pour "pister" une erreur possible.
Ces deux lignes de code sont donc complètement inutiles !
Ton code doit donc ressembler à ça :

HID, Temp : String; // que tu as déclaré en var globales
procedure TFmain.IdToIpClick(Sender: TObject);
begin
  temp := '';
  HID := IntToHex(StrToInt(ID.Text), 8);
  Temp := InverseStr(HID);  
  IpA.Text := IntToStr(StrToInt('$'+Copy(Temp,1,2)));
  IpB.Text := IntToStr(StrToInt('$'+Copy(Temp,3,2)));
  IpC.Text := IntToStr(StrToInt('$'+Copy(Temp,5,2)));
  IpD.Text := IntToStr(StrToInt('$'+Copy(Temp,7,2)));
end;


Voilà. Bon, j'espère n'avoir rien oublié...
0
cs_AMokers Messages postés 83 Date d'inscription jeudi 18 juillet 2002 Statut Membre Dernière intervention 8 octobre 2008
23 déc. 2003 à 20:47
Merci beaucoup ;)
Je publierais bientot la source :)
0
Rejoignez-nous