OVH Cloud OVH Cloud

[WDx] Tentative d'optimisation de mes procédures

8 réponses
Avatar
Georges Peyre
Bonjour,

J'ai créé une application anti-spam qui me donne satisfaction à
l'exception d'un détail qui me hérisse un peu.

J'utilise un système de filtres divers qui sont utilisés en priorité
pour la détection d'un message de spam ...
Domaines internet interdits
Caractères interdits
Charsets interdits
Mots interdits
Expéditeurs interdits
etc ..

et en ultime filtre j'utilise un fichier qui contient les fourchettes
d'adresses IP anormales pour un domaine donné.
Ce fichier est composé :
- d'une adresse IP de début
- d'une adresse IP de fin
- Nom du domaine
Toute adresse IP comprise entre ces 2 adresses n'est pas valide

Mon contrôle est le suivant : pour chaque adresse IP trouvée dans
l'entête d'un
message, je la reformate en nnn.nnn.nnn.nnn puis je vérifie si celle-ci
est comprise entre l'adresse IP de début et l'IP de fin d'un
enregistrement du
fichier : si je trouve une seule fois je considère que le message est
un spam.

Cette recherche fonctionne parfaitement et me donne entièrement
satisfaction :
le fichier contient 17160 fourchettes, mais le temps mis à la détection
me
semble un peu trop long et je voudrais pouvoir l'optimiser.

Pour vérifier une adresse IP donnée quelle procédure écririez-vous pour
avoir
le temps de détection le plus court ?

Toutes les idées ou astuces sont les bienvenues.

Merci d'avance

Cordialement

--
Elle est pas belle la vie ?

8 réponses

Avatar
Romain PETIT
Georges Peyre avait soumis l'idée :

Toute adresse IP comprise entre ces 2 adresses n'est pas valide



Comptes-tu faire les mises à jour des noms de domaine et des IP
associées ?
(les plages d'adresses, c'est relativement mouvant)

Mon contrôle est le suivant : pour chaque adresse IP trouvée dans l'entête
d'un
message, je la reformate en nnn.nnn.nnn.nnn puis je vérifie si celle-ci
est comprise entre l'adresse IP de début et l'IP de fin d'un enregistrement
du
fichier : si je trouve une seule fois je considère que le message est un
spam.
Cette recherche fonctionne parfaitement et me donne entièrement satisfaction
:
le fichier contient 17160 fourchettes, mais le temps mis à la détection me
semble un peu trop long et je voudrais pouvoir l'optimiser.



Comment fais-tu ta vérification ? Avec un algo qui compare les IP au
format 4 nombres décimaux ?
Il est préférable d'utiliser directement l'entier long correspondant à
l'IP.
Une API existe pour cela :
http://groups.google.fr/group/fr.comp.developpement.agl.windev/msg/5a8f4ed6b5354bee


Ainsi, tu n'auras qu'à faire un test d'intervalle :
SI (eIPmin < eIPAtester < eIPmax) ALORS ...

A+

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Georges Peyre
Bonjour Romain,
Toujours aussi pointu !!

Comptes-tu faire les mises à jour des noms de domaine et des IP associées ?
(les plages d'adresses, c'est relativement mouvant)


Pas régulièrement : Je ne fais des mises a jour que lorsque je constate
que j'ai
un blocage pour un message correct.

Comment fais-tu ta vérification ? Avec un algo qui compare les IP au format 4
nombres décimaux ?


Pas du tout : je le fais par 4 recherches génériques successives ce qui
explique le
temps de recherche

Il est préférable d'utiliser directement l'entier long correspondant à l'IP.
Une API existe pour cela :
http://groups.google.fr/group/fr.comp.developpement.agl.windev/msg/5a8f4ed6b5354bee
Ainsi, tu n'auras qu'à faire un test d'intervalle :


SI (eIPmin < eIPAtester < eIPmax) ALORS ...


Je vais de ce pas suivre ton conseil

Je remercie infiniment

Cordialement

--
Elle est pas belle la vie ?
Avatar
Georges Peyre
Au secours Romain

Pour transformer mon fichier j'utilise la procédure suivante :
elAdresseIPlong = API("wsock32.dll","inet_addr", IPADRESSE.IPDEB)
IPADRESSED.IPDEB = elAdresseIPlong
elAdresseIPlong = API("wsock32.dll","inet_addr", IPADRESSE.IPFIN)
IPADRESSED.IPFIN = elAdresseIPlong

Le probleme est que le résultat est incorrect
l'adresse 004.000.038.034 donne 4294967295
et
l'adresse 004.000.038.036 donne aussi 4294967295
puis
l'adresse 004.000.038.042 donne 4294967295
et
l'adresse 004.000.038.052 donne aussi 4294967295

Est-ce que j'utilise mal l'API ?
Compte-tenu de l'observation sur le traitement de Intel faut il fournir
l'adresse inverse à l'API ?
Où est le problème ?

Cordialement

--
Elle est pas belle la vie ?
Avatar
Georges Peyre
Après test la formule suivante est précise :

IpA = Gauche(IPADRESSE.IPDEB,3)
IpB = Milieu(IPADRESSE.IPDEB,5,3)
IpC = Milieu(IPADRESSE.IPDEB,9,3)
IpD = Milieu(IPADRESSE.IPDEB,13,3)
AdresseIPDec =((IpA * 256 + IpB) * 256 + IpC ) * 256 + IpD

Je vais l'utiliser

Merci encore Romain

Cordialement

--
Elle est pas belle la vie ?
Avatar
Daniel
Bonjour,


essaie ce code il fonctionne

// on convertit l'addresse IP en entier 32 bits
elAdresseIPlong est un entier sans signe
elAdresseIPlong = API("wsock32.dll","inet_addr", "004.000.038.036")

SI elAdresseIPlongB94967295 ALORS Erreur("Adresse IP invalide")
//Attention, donne 3520254932 et non 3570651857
//car sous les machines Intel, les octets sont ordonnés de droite à
//gauche
//(209.210.211.212) cf
//:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winso ck/winsock/inet_addr_2.asp
Info(elAdresseIPlong)
//la fonction inverse pour retrouver l'adresse IP (ipv4) à partir du long
elPointeur est un entier
sAdresseIP est un chaîne ASCIIZ sur 255
elPointeur = API("wsock32.dll","inet_ntoa", elAdresseIPlong)
sAdresseIP=ChaîneRécupère(elPointeur, crAdresseASCIIZ)
Info(sAdresseIP)


Dans ton cas fait attention 004.000.038.036 ne donne pas la même
adresse en reverse.


"Georges Peyre" writes:

Au secours Romain

Pour transformer mon fichier j'utilise la procédure suivante :
elAdresseIPlong = API("wsock32.dll","inet_addr", IPADRESSE.IPDEB)
IPADRESSED.IPDEB = elAdresseIPlong
elAdresseIPlong = API("wsock32.dll","inet_addr", IPADRESSE.IPFIN)
IPADRESSED.IPFIN = elAdresseIPlong

Le probleme est que le résultat est incorrect
l'adresse 004.000.038.034 donne 4294967295
et
l'adresse 004.000.038.036 donne aussi 4294967295
puis
l'adresse 004.000.038.042 donne 4294967295
et
l'adresse 004.000.038.052 donne aussi 4294967295

Est-ce que j'utilise mal l'API ?
Compte-tenu de l'observation sur le traitement de Intel faut il fournir
l'adresse inverse à l'API ?
Où est le problème ?

Cordialement

--
Elle est pas belle la vie ?




--
suivre ce lien pour répondre:
http://cerbermail.com/?2KrV3YZXnn
Daniel
;-)
Avatar
Georges Peyre
Bonjour Daniel,

Dans son message précédent, Daniel a écrit :
essaie ce code il fonctionne

// on convertit l'addresse IP en entier 32 bits
elAdresseIPlong est un entier sans signe
elAdresseIPlong = API("wsock32.dll","inet_addr", "004.000.038.036")
SI elAdresseIPlongB94967295 ALORS Erreur("Adresse IP invalide")



Le fichier des adresses IP interdites que j'utilise contient des
fourchettes d'adresses
qui peuvent être invalides ou bidon. Mais ces fourchettes peuvent
également contenir des
adresses qui seraient bonnes en structure mais néanmoins interdites sur
le plan du spam.
Je ne peux donc utiliser l'API qui ne transforme pas intégralement le
format IP en valeur décimale car cà me ferait supprimer beaucoup de
fourchettes.

Donc pour conserver l'intégralité de mon fichier je vais utiliser la
formule
IpA = Gauche(IPADRESSE.IPDEB,3)
IpB = Milieu(IPADRESSE.IPDEB,5,3)
IpC = Milieu(IPADRESSE.IPDEB,9,3)
IpD = Milieu(IPADRESSE.IPDEB,13,3)
AdresseIPDec =((IpA * 256 + IpB) * 256 + IpC ) * 256 + IpD

exemple : 004.000.038.034 donne 67118626
et 004.000.038.036 donne 67118628

Nota : Je n'ai pas besoin transformer une adresse IP Décimale en
adresse IP normale

Cordialement

--
Elle est pas belle la vie ?
Avatar
Romain PETIT
Georges Peyre a exposé le 06/05/2005 :

Est-ce que j'utilise mal l'API ?



Oui ! Il faut respecter le format de l'adresse IP : les zéros à gauche
n'ont rien à faire là en notation décimale sinon il s'agit d'une
adresse IP en octal !
(cf
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/inet_addr_2.asp)

elAdresseIPlong est un entier sans signe
elAdresseIPlong = API("wsock32.dll","inet_addr", "4.0.38.34")
Trace(elAdresseIPlong)
elAdresseIPlong = API("wsock32.dll","inet_addr", "4.0.38.36")
Trace(elAdresseIPlong)
elAdresseIPlong = API("wsock32.dll","inet_addr", "4.0.38.42")
Trace(elAdresseIPlong)
elAdresseIPlong = API("wsock32.dll","inet_addr", "4.0.38.52")
Trace(elAdresseIPlong)


Compte-tenu de l'observation sur le traitement de Intel faut il fournir
l'adresse inverse à l'API ?



Non, si tu utilises la fonction inverse, tu retomberas sur la bonne
adresse (il faudra juste faire attention si tu dois reconvertir "en
manuel").
(je te conseille d'utiliser l'API plutôt que le calcul, c'est plus
rapide)

A+

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Georges Peyre
Merci à Romain et Daniel

Grâce à vous mon programme tourne 10 FOIS PLUS VITE ( air connu )

Cordialement

--
Elle est pas belle la vie ?