SCANNER DE PORT EN C

Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011
- - Dernière réponse : deck_bsd
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
- 18 janv. 2007 à 15:13
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/25986-scanner-de-port-en-c

deck_bsd
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
1 -
Yop,

sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_addr.s_addr = inet_addr(ip);
sin.sin_family = AF_INET;

peut être mis hors de la boucle pour optimiser ton code.
wizard512
Messages postés
470
Date d'inscription
dimanche 9 janvier 2005
Statut
Membre
Dernière intervention
11 mai 2013
-
Bonne source,
simple et utile, trés utile,
et en plus avec dev c++
Merci....

Note : 9/10
enhr
Messages postés
3
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
4 décembre 2005
-
j'ai moi aussi des problème de compilation
les messages d'erreurs
undefined reference to `WSAStartup@8'
undefined reference to `socket@12'

undefined reference to `inet_addr@4'
undefined reference to `htons@4'
undefined reference to `connect@12'
undefined reference to `closesocket@4'
undefined reference to `WSACleanup@0'
collect2: ld returned 1 exit status
j'ai vraiment besion d'aide comment configurer mon compilateur?
excrt
Messages postés
75
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
3 juillet 2006
-
//...
char *ip = "127.0.0.1";//ip de la machine a scnanner (dans ce cas-ci localhost)
WORD o 0; // WORD> unsigned short
WORD f = 0;
WORD x;
WORD port;
WORD port_max = 30;
WORD port_initial = 20;
//port_initial = 20; //premier port a scanner
//port_max = 30; //dernier port a scanner
x = (port_max - port_initial);
//...

pour obtenir un max de portabilité d'un compilateur/lieur(linker) à un autre, éviter les extensions dans le noms des librairies
« #pragma comment(lib, "ws2_32.lib") » devient ceci « #pragma comment(lib, "ws2_32") »
sous Dev-C++/CodeBlocks c'est « libws2_32.a » et sous MSVC c'est « ws2_32.lib », seul le nom(sans extension) de la librairie suffit dans le « #pragma ... »

si par malheur le pragma ne fonctionne pas alors il faut ajouter la librairie dans les options de compilation(pour le lieur/linker)
cs_YURIX
Messages postés
18
Date d'inscription
samedi 21 août 2004
Statut
Membre
Dernière intervention
12 décembre 2009
-
J'ai un problème lorsque j'essaie de compiler le code avec Dev-C++ 4

Le log du compilateur me donne:

Compilateur: Default compiler
Exécution de g++.exe...
g++.exe "C:\Documents and Settings\YuRi\Bureau\Scanner.cpp" -o "C:\Documents and Settings\YuRi\Bureau\Scanner.exe" -fno-access-control -fmessage-length=0 -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"C:\Dev-Cpp\include\c++\3.4.2\backward" -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32" -I"C:\Dev-Cpp\include\c++\3.4.2" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib" -fmessage-length=0

In function `int main(int, char**)':
warning: passing `float' for converting 1 of `u_short htons(u_short)'

undefined reference to `WSAStartup@8'
undefined reference to `socket@12'

undefined reference to `inet_addr@4'
undefined reference to `htons@4'
undefined reference to `connect@12'
undefined reference to `closesocket@4'
undefined reference to `WSACleanup@0'
collect2: ld returned 1 exit status

Exécution terminée

A chaque fois que j'essaie de faire un fichier cpp avec le code pour les winsocks j'ai cette erreur. Quelqu'un aurait-il une solution a mon problème ?
NitRic
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011
-
Petite remarque:

WSACleanup();
closesocket(sock);

c'est pas bon ca, tu dois libérer les ressources lorsque tu en à terminé et non avant d'en avoir terminé:

...
closesocket(sock);

WSACleanup();
return 0;


Autre remarque:

tu utilise un `struct sockaddr_in sin;` donc dans ton connect() tu devrais lui envoyer: sizeof(struct sockaddr_in) ou encore: sizeof(sin)

connect() renvoie 0 si aucune erreur sauf que ton socket peu bloquer, être en progression, ... vérifie le code d'erreur. WSAEWOULDBLOCK et WSAEINPROGRESS ne constituent en rien une erreur mais plutôt un avertissement si on veut:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/windows_sockets_error_codes_2.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/connect_2.asp

tu pourrais mettre un timeout sur tes opérations ou y aller en raw ...



~(.:: NitRic ::.)~
NitRic
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011
-
premier fichier à inclure => winsock2.h <= tout en haut
si tu inclus `windows.h` avant, ca cause ce genre de problème car `windows.h` inclut `winsock.h`(version 1).


/* main.c */
#include <winsock2.h>
#include <stdio.h>
#include <string.h>
/* etc ... */

int main()
{

/* ... */
return 0;

}


au fait, winsock2.h inclut windows.h alors une simple inclusion de winsock2.h suffit ...



~(.:: NitRic ::.)~
cs_Seiken
Messages postés
14
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
24 avril 2005
-
Chez moi ça ne compile pas :

2 sockets2.c
C:\DEV-C_~1\Include\winsock2.h:126: warning: `FD_CLR' redefined
58 c:\dev-c_~1\include\winsock.h
warning: this is the location of the previous definition
141 c:\dev-c_~1\include\winsock2.h
warning: `FD_SET' redefined
.....

Je suis sous Dev-C++ 4, quelqu'un peut m'aider ?
Krox68
Messages postés
157
Date d'inscription
jeudi 17 octobre 2002
Statut
Membre
Dernière intervention
11 septembre 2004
-
desolé nitric je vais m'appliquer maintenant
en fait c'est pas l'initialisation de la socket mais surtout la boucle va voir dans mes sources pour des scanners plus evolué
en tout cas c'est un bon debut en socket
@+
zinotron
Messages postés
65
Date d'inscription
vendredi 14 février 2003
Statut
Membre
Dernière intervention
11 septembre 2004
-
ben moi je dirais juste que la fonction connect() est vachement lente et que je sais que ya des choses a faire pour aller plus vite (bon, faut aller fouiller dans les raw socket et non pas dans les stream sockets, et c'est beaucoup moin facile-pour moi en tout cas :p )

C'est tout

Zinotron
cs_shown
Messages postés
40
Date d'inscription
jeudi 26 août 2004
Statut
Membre
Dernière intervention
24 décembre 2007
-
Krox68, non j'ai rien pompé alors peut être qu'il existe presque le même à quelque part en tout cas je suis pas au courant. Donne le lien j'irai voir. Mais de toute façon il est clair que le principe doit être semblable, notament la création du socket : il n'y a pas 36 solutions pour creer et initialiser un socket en partant de là il ne reste plus que la technique pour vérifier si un port est ouvert qui peut différer mais encore une fois elle non plus n'a rien d'exceptionnelle.
NitRic
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011
-
faut apprendre à écrire Krox68, c'est vraiment dur à lire ...



~(.:: NitRic ::.)~
Krox68
Messages postés
157
Date d'inscription
jeudi 17 octobre 2002
Statut
Membre
Dernière intervention
11 septembre 2004
-
slt, dsl de te dire sa et peut etre ke je me trompe mai sa sen le pompage sur des sources kasi identiques sur le site
si c pa le cas torai du regarder avan de poster com sa torai mi des fonctions ke les otre scan navai pa
jespere me tromper si c le ca c un bon ebu a par kelk petites erreurs
@+
cs_aardman
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2 -
Salut,
Aucun WSACleanup(), aucun closesocket(), ...
Pour la boucle principale: un for ou un do-while, il faut choisir, mais pas les deux.
cs_shown
Messages postés
40
Date d'inscription
jeudi 26 août 2004
Statut
Membre
Dernière intervention
24 décembre 2007
-
Pas de problème, merci pour les conseils.
Je corrigerai et je mettrai à jour :)
NitRic
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011
-
sizeof(struct sockaddr) != sizeof(struct sockaddr_in)

Je trouve drôle le fait que la petite image te représentant il soit inscrit ANSI C mais que ton code ne le soit pas :)( Ce n'est pas un reproche, rassure toi :) )

Personnellement, je te conseil de valider les valeurs retournées par les appels des fonctions un peu plus.
Il est toujours utile de savoir si la fonction à echouée ou réussi :)

Plutôt que d'utiliser %i et %d à la random, reste avec %d. Okay, ils représentent tous les deux un entier signé mais c'est plus `commode` %d qui est le plus utilisé. Je dis ca simplement pour les personnes ne sachant pas ce que représent %i.

Un `return 0;` à la fin de ton main() serait bien aussi. Certain compilateur pourrait ne pas aimer s'il y en à pas.

Si tu n'a aucun formatage à faire lors de l'affichage de chaine à l'écran, tu peux utiliser puts(). Simple suggestion.



~(.:: NitRic ::.)~