SCANNER DE PORT EN C

NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011 - 7 sept. 2004 à 03:19
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 2
18 janv. 2007 à 15:13
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 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
11 nov. 2006 à 22:48
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
28 juin 2006 à 13:51
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
17 mai 2006 à 19:58
//...
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
12 mai 2006 à 23:51
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
26 avril 2005 à 01:33
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
26 avril 2005 à 01:15
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
24 avril 2005 à 17:28
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 1
11 sept. 2004 à 10:48
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
11 sept. 2004 à 08:05
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
11 sept. 2004 à 01:02
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
11 sept. 2004 à 00:32
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 1
10 sept. 2004 à 22:37
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 3
7 sept. 2004 à 04:11
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
7 sept. 2004 à 03:22
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
7 sept. 2004 à 03:19
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 ::.)~
Rejoignez-nous