IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

[IdTCPClient] Comment scanner des ports en multithread ?


Sujet :

Composants VCL Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 42
    Points : 30
    Points
    30
    Par défaut [IdTCPClient] Comment scanner des ports en multithread ?
    Lu,
    Lu j'ai demander des conseils y'a quelques jours pour faire un scanner de ports, en fait j'utilise le composant "IdTCPClient" (a voir si le meilleur), mais j'arrive tout de meme a scanner, mais 2 inconvenients majeurs :

    - j'aimerais savoir si possible de faire du "Multithread" avec un composant comme "IdTCPClient", et biensur si oui, un petit exemple serait le bienvenu.


    - Autrement, ma fenetre se fige pendant le scan : elle ne se reactualise pas / elle ne se ferme pas.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    begin
    P:= 1;
    repeat
    with IdTCPClient1 do
        begin
        Host := edit1.Text;
        Port := P;
        Str(P, po);
        P := P + 1;
        Edit2.Text := po;
          try
          Connect(500);
     
          except
          on E : Exception do  // Pour les Ports non-ouverts.
             begin
             po := '';
             end;
          end;
          Memo1.Text := Memo1.Text + po;
          end;
      until P = 65500
     
    end;
    merci..

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Les serveurs d'Indy sont tous forcément threadés : ils sont faits ainsi. Donc je ne comprends même pas l'à propos de ta question
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    j'aimerais savoir si possible de faire du "Multithread" avec un composant comme "IdTCPClient", et biensur si oui, un petit exemple serait le bienvenu
    Oui. Il faut créer plusieurs threads avec chacun un TIdTCPClient, chaque thread s'occupant d'une plage de ports particuliers. Pour communiquer avec l'interface graphique, toujours par contre passer par Synchronize (cf. multitude de posts sur ce forum).

    Autrement, ma fenetre se fige pendant le scan : elle ne se reactualise pas / elle ne se ferme pas.
    D'où l'intérêt de faire du multithread dès le départ. Ou utiliser le composant TIdAntiFreeze...
    "It's more fun to compute !"

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    sjrd --> Les serveurs d'Indy sont tous forcément threadés : ils sont faits ainsi. Donc je ne comprends même pas l'à propos de ta question
    : à mon avis, tu n'as pas compris ma question.


    Reisubar --> Il faut créer plusieurs threads avec chacun un TIdTCPClient
    je voudrais environ 300 threads max, ca va pas etre evident un composant pour chaque; y'a pas une routine pour ca?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Tu les créé dynamiquement

  7. #7
    Membre émérite
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 215
    Points : 2 303
    Points
    2 303
    Par défaut
    bonjour,

    tu peux aussi utiliser les composants ICS (http://www.overbyte.be/frame_index.html?redirTo=/products/ics.html). Ils sont plus difficiles d'approche, mais ils sont évennementiel, donc non bloquant. Avec eux, tu n'aurais pas besoin de passer par une gestion multi-thread.

    @++
    Dany

  8. #8
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    Tu les créé dynamiquement
    Apolllo, tu peuts aprofondir un peu stp

    skywaukers, merci, je vais regarder ...

    Et merci aux autres.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    J'ai peut etre parlé trop vite, si personne ne m'a suivit, je m'y connasi aps trop bien mais je pense que tu peux faire un truc comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TidTCPClient.Create();
    Avec une boucle genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var NbSocket : integer;
    begin
    NbSocket:=100;
    For NbSocket:=0 to 100 do
    TidTCPClient.Create();
    end;
    Il doit y avoir d'autre parametres, mais il est surement possible de faire ca enfin c'est a vérifier, je suis noob :d ^^
    Si ce que j'ai écrit est possible, je ne pense pas que ce soit la meilleure solution...Il faudrait les détruire massivement les TidTCPClient a la fin du scan :s
    Attente du verdict !

  10. #10
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    Je vais essayer, mais je suis un peu pessimiste ...

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Atta, je me suis planté !!!! lol j'ai modifié mon code !

  12. #12
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    Merci a toi Apollo, mais TidTCPClient.Create() ne peut pas etre un "integer", je n'ai rien trouvé comme exemple concret concernant la class .create(Tcomponent), je ne pense pas qu'elle créee d'autres composants.


    Tout marche nickel sauf cette histoire de threads, GRRRR !!!!!!!!!!

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Beh, ce n'est pas un integer,j'ai créé un boucle afin d'en créer autant que la var NbSocket !
    Beh apres je m'y connais pas en indy donc voila, mais quel est le message d'erreur ?

  14. #14
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Bon, voilà un exemple absolument pas testé mais qui peut te mettre dans la bonne direction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    type
      //Prototype de procédure à appeller quand un port est détecté ouvert
      TOpenPortEvent = procedure (Sender: TObject; const APort: Integer) of object;
     
      //Idem, si fermé
      TClosedPortEvent = procedure (Sender: TObject; const APort: Integer) of object;
     
       //Le thread de scan
      TScanThread = class(TThread)
       private
         FMinPort: Integer;
         FMaxPort: Integer;
         FTCPClient: TIdTCPClient;
         FOpenProc: TOpenPortEvent;
         FClosedProc: TClosedPortEvent;
         FHost: Integer;
       protected
         procedure Execute; override;
       public
         destructor Destroy; override;
         constructor Create(const AMinPort, AMaxPort : Integer; AOnOpenPort: TOpenPortEvent; AOnClosedPort: TClosedPortEvent; const AHost: string);
        end;
     
    constructor TScanThread.Create(const AMinPort, AMaxPort : Integer; AOnOpenPort: TOpenPortEvent; AOnClosedPort: TClosedPortEvent; const AHost: string)
    begin
      inherited Create(True);
      //Création du client
      FTcpClient  := TIdTCPClient.Create;
      //initialisation des propriétés
      FMaxPort := AMaxPort;
      FMinPort := AMinPort;
      FHost := AHost;
      FOpenProc := AOnOpenPort;
      FClosedPort := AOnClosedPort; 
    end;
     
    procedure TScanThread.Execute; 
    var
      I: Integer;
    begin
       //le code du scan
       FTCPClient.Host := FHost;
       for I := FMinPort to FMaxPort do
          try
             FTCPClient.Port := I;
             FTCPClient.Connect(500);
             try
               FOpenProc(Self, I); //Appelle la procédure de notification port ouvert 
             finally  
                 FTCPClient.Disconnect;
             end;  
          except
             On E: TIdException do
                FClosedProc(Self, I); //Appelle la procédure de notification port fermé
          end;
       end;
    end;
     
    destructor TScanThread.Destroy;
    begin
       if FTcpClient.Connected then
          FTcpClient.Disconnect;
        FTcpClient.Free;
    end;
    Le principe est de donner au thread (lors de sa construction) un intervalle de port, deux fonctions à rappeller et un hôte. Le thread scannera l'hote et appellera alternativement les fonctions selon que le port est ouvert ou non. Il manque bien sûr le code relatif à leur création: il faudrait ici choisir un nombre de threads et diviser l'intervalle à scanner en fonction de ce nombre pour attrivuer une plage homogène à chaque thread.
    "It's more fun to compute !"

  15. #15
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    Thx Reisubar, mais mon code fonctionne...


    Le thread scannera l'hote et appellera alternativement les fonctions selon que le port est ouvert ou non. Il manque bien sûr le code relatif à leur création
    Mais c'est bien ca mon probleme, c'est bien créer un nombre definit de thread par l'utilisateur ou alors je n'ai compris ce que t'as voulu me dire.


    Si cree ton client peut-on en creer infiniment et si oui comment les gerer ?



    Voila mon code pour le scanner de ports, à un seul theard malheureusement, mais il est OK !!!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
      IdTCPClient, IdAntiFreezeBase, IdAntiFreeze, DosCommand;
     
    type
      TForm1 = class(TForm)
        IdTCPClient1: TIdTCPClient;
        Button1: TButton;
        Edit1: TEdit;
        Memo1: TMemo;
        Edit2: TEdit;
        Button2: TButton;
        IdAntiFreeze1: TIdAntiFreeze;
        DosCommand1: TDosCommand;
        procedure Button1Click(Sender: TObject);
        procedure IdTCPClient1Connected(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure FormActivate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
      P : Integer;
      po : string ;
     
    implementation
     
    {$R *.dfm}
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    P:= 1;                      // Port min
    repeat
    with IdTCPClient1 do
        begin
        Host := edit1.Text;     // L'IP biensur
        Port := P;
        Str(P, po);
        P := P + 1;            // Incrementation des ports
        Edit2.Text := po;      // Affiche les ports en cours de scan
          try
          Connect(500);
     
          except
          on E : Exception do  // Pour les Ports non-ouverts.
             begin
             po := '';         // Permet d'afficher dans memo1 que les ports ouverts
             end;
          end;
          Memo1.Text := Memo1.Text + po;
          end;
      until P = 65500  // Port max
     
    end;
     
    procedure TForm1.IdTCPClient1Connected(Sender: TObject);
    begin
    IdTCPClient1.Disconnect;   // Deconnecter si port ouvert
     
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    application.Terminate;
    end;
     
    procedure TForm1.FormActivate(Sender: TObject);
    begin
    Memo1.clear;
    end;
     
    end.

    Merci a tout ceux qui s'investissent pour les autres

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Voila l'appli d'un pote en C++, bien sur elel est en console mais il ne se sert pas d'indy, peut etre pourra tu t'en inspirer et integrer dans ton programme une console
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
     
    #include <winsock2.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #pragma comment&#40;lib, "ws2_32.lib"&#41; 
    #include <time.h> 
    #include "stdafx.h" 
    #include "String.h" 
     
    struct config 
    &#123; 
    SOCKET sock; 
    SOCKADDR_IN sin; 
    int ip; 
    int port; 
    HANDLE hthread; 
    &#125;; 
     
    int nthread=1; 
     
    DWORD WINAPI connection&#40; LPVOID Param &#41; 
    &#123; 
    struct config * conf = &#40;struct config *&#41;Param; 
    WSADATA WSAData; 
    WSAStartup&#40;MAKEWORD&#40;2,0&#41;, &WSAData&#41;; 
    conf->sin.sin_addr.s_addr = ntohl&#40;conf->ip&#41;; 
    conf->sin.sin_family = AF_INET; 
    conf->sin.sin_port = ntohs&#40;conf->port&#41;; 
    conf->sock = socket&#40;AF_INET,SOCK_STREAM,0&#41;; 
    bind&#40;conf->sock, &#40;SOCKADDR *&#41;&conf->sin, sizeof&#40;conf->sin&#41;&#41;; 
    if &#40; !connect&#40;conf->sock, &#40;SOCKADDR *&#41;&conf->sin, sizeof&#40;conf->sin&#41;&#41; &#41; 
    &#123; 
    FILE * fic; 
    char retour&#91;&#93; = "\n"; 
    /* Ouverture d'un fichier */ 
    fic = fopen&#40;"resultats.dat", "a+"&#41;; 
    /* Ecrire chaîne dans le fichier */ 
    fwrite&#40;inet_ntoa&#40;conf->sin.sin_addr&#41;, strlen&#40;inet_ntoa&#40;conf->sin.sin_addr&#41;&#41;, 1, fic&#41;; 
    fwrite&#40;retour, strlen&#40;retour&#41;, 1, fic&#41;; 
    fclose&#40;fic&#41;; 
    &#125; 
    nthread++; 
    closesocket&#40;conf->sock&#41;; 
    WSACleanup&#40;&#41;; 
    CloseHandle&#40;conf->hthread&#41;; 
    free&#40;conf&#41;; 
    &#125; 
     
    int main&#40;int argc, char *argv&#91;&#93;&#41; 
    &#123; 
    int startip; 
    int endip; 
    int port; 
    int aleatip; 
    struct config * conf = NULL; 
    if &#40; argc == 4 &#41; 
    &#123; 
    startip = htonl&#40;inet_addr&#40;argv&#91;1&#93;&#41;&#41;; 
    endip = htonl&#40;inet_addr&#40;argv&#91;2&#93;&#41;&#41;; 
    port = atoi&#40;argv&#91;3&#93;&#41;; 
    nthread = 100; 
    &#123; 
    FILE * fic; 
    char retour&#91;&#93; = "\n"; 
    /* Ouverture d'un fichier */ 
    fic = fopen&#40;"resultats.dat", "a+"&#41;; 
    char commande&#91;&#93; = "scan.exe "; 
    char espace&#91;&#93; = " "; 
    /* Ecrire chaîne dans le fichier */ 
    fwrite&#40;commande, strlen&#40;commande&#41;, 1, fic&#41;; 
    fwrite&#40;argv&#91;1&#93;, strlen&#40;argv&#91;1&#93;&#41;, 1, fic&#41;; 
    fwrite&#40;espace, strlen&#40;espace&#41;, 1, fic&#41;; 
    fwrite&#40;argv&#91;2&#93;, strlen&#40;argv&#91;2&#93;&#41;, 1, fic&#41;; 
    fwrite&#40;espace, strlen&#40;espace&#41;, 1, fic&#41;; 
    fwrite&#40;argv&#91;3&#93;, strlen&#40;argv&#91;3&#93;&#41;, 1, fic&#41;; 
    fwrite&#40;retour, strlen&#40;retour&#41;, 1, fic&#41;; 
    fclose&#40;fic&#41;; 
    &#125; 
    for &#40;;startip <= endip;startip++&#41; 
    &#123; 
    while &#40; !nthread &#41;; 
    &#123; 
    conf = &#40;struct config *&#41; malloc&#40;sizeof&#40;struct config&#41; &#41;; 
    conf->ip = startip; 
    conf->port = port; 
    conf->hthread = CreateThread&#40;NULL, 0, &connection, conf, 0, 0&#41;; 
    nthread--; 
    &#125; 
    &#125; 
    _sleep&#40;150&#41;; 
    FILE * fic; 
    char retour&#91;&#93; = "\n"; 
    /* Ouverture d'un fichier */ 
    fic = fopen&#40;"resultats.dat", "a+"&#41;; 
    char finscan&#91;&#93; = "scan terminé\n"; 
    fwrite&#40;finscan, strlen&#40;finscan&#41;, 1, fic&#41;; 
    fwrite&#40;retour, strlen&#40;retour&#41;, 1, fic&#41;; 
    fclose&#40;fic&#41;; 
    return 0; 
    &#125; 
    else if &#40; argc == 5&#41; 
    &#123; 
    startip = htonl&#40;inet_addr&#40;argv&#91;1&#93;&#41;&#41;; 
    endip = htonl&#40;inet_addr&#40;argv&#91;2&#93;&#41;&#41;; 
    port = atoi&#40;argv&#91;3&#93;&#41;; 
    nthread = atoi&#40;argv&#91;4&#93;&#41;; 
    &#123; 
    char retour&#91;&#93; = "\n"; 
    char commande&#91;&#93; = "scan.exe "; 
    char espace&#91;&#93; = " "; 
    FILE * fic; 
    /* Ouverture d'un fichier */ 
    fic = fopen&#40;"resultats.dat", "a+"&#41;; 
    /* Ecrire chaîne dans le fichier */ 
    fwrite&#40;commande, strlen&#40;commande&#41;, 1, fic&#41;; 
    fwrite&#40;argv&#91;1&#93;, strlen&#40;argv&#91;1&#93;&#41;, 1, fic&#41;; 
    fwrite&#40;espace, strlen&#40;espace&#41;, 1, fic&#41;; 
    fwrite&#40;argv&#91;2&#93;, strlen&#40;argv&#91;2&#93;&#41;, 1, fic&#41;; 
    fwrite&#40;espace, strlen&#40;espace&#41;, 1, fic&#41;; 
    fwrite&#40;argv&#91;3&#93;, strlen&#40;argv&#91;3&#93;&#41;, 1, fic&#41;; 
    fwrite&#40;espace, strlen&#40;espace&#41;, 1, fic&#41;; 
    fwrite&#40;argv&#91;4&#93;, strlen&#40;argv&#91;4&#93;&#41;, 1, fic&#41;; 
    fwrite&#40;retour, strlen&#40;retour&#41;, 1, fic&#41;; 
    fclose&#40;fic&#41;; 
    &#125; 
    for &#40;;startip <= endip;startip++&#41; 
    &#123; 
    while &#40; !nthread &#41;; 
    &#123; 
    conf = &#40;struct config *&#41; malloc&#40;sizeof&#40;struct config&#41; &#41;; 
    conf->ip = startip; 
    conf->port = port; 
    conf->hthread = CreateThread&#40;NULL, 0, &connection, conf, 0, 0&#41;; 
    nthread--; 
    &#125; 
    &#125; 
    _sleep&#40;150&#41;; 
    FILE * fic; 
    char retour&#91;&#93; = "\n"; 
    /* Ouverture d'un fichier */ 
    fic = fopen&#40;"resultats.dat", "a+"&#41;; 
    char finscan&#91;&#93; = "scan terminé\n"; 
    /* Ecrire chaîne dans le fichier */ 
    fwrite&#40;finscan, strlen&#40;finscan&#41;, 1, fic&#41;; 
    fwrite&#40;retour, strlen&#40;retour&#41;, 1, fic&#41;; 
    fclose&#40;fic&#41;; 
    return 0; 
    &#125; 
    else if &#40; argc == 3&#41; 
    &#123; 
    srand &#40;&#40;unsigned&#41;time &#40;0&#41;&#41;; 
    //int a,b,c,d,i=1000; 
    int a; 
    int b; 
    int c; 
    int d; 
    char str&#91;20&#93;; 
    port = atoi&#40;argv&#91;1&#93;&#41;; 
    nthread = atoi&#40;argv&#91;2&#93;&#41;; 
    startip = 1; 
    endip = 1000; 
    &#123; 
    char retour&#91;&#93; = "\n"; 
    char commande&#91;&#93; = "scan.exe random "; 
    char espace&#91;&#93; = " "; 
    FILE * fic; 
    /* Ouverture d'un fichier */ 
    fic = fopen&#40;"resultats.dat", "a+"&#41;; 
    /* Ecrire chaîne dans le fichier */ 
    fwrite&#40;commande, strlen&#40;commande&#41;, 1, fic&#41;; 
    fwrite&#40;argv&#91;1&#93;, strlen&#40;argv&#91;1&#93;&#41;, 1, fic&#41;; 
    fwrite&#40;espace, strlen&#40;espace&#41;, 1, fic&#41;; 
    fwrite&#40;argv&#91;2&#93;, strlen&#40;argv&#91;2&#93;&#41;, 1, fic&#41;; 
    fwrite&#40;retour, strlen&#40;retour&#41;, 1, fic&#41;; 
    fclose&#40;fic&#41;; 
    &#125; 
    for &#40;;startip = startip;startip++&#41; 
    &#123; 
    while &#40;!nthread&#41;; 
    &#123; 
    a=rand&#40;&#41;%256; 
    b=rand&#40;&#41;%256; 
    c=rand&#40;&#41;%256; 
    d=rand&#40;&#41;%256; 
    sprintf&#40;str,"%d.%d.%d.%d",a,b,c,d&#41;; 
    aleatip=htonl&#40;inet_addr&#40;str&#41;&#41;; 
    conf = &#40;struct config *&#41; malloc&#40;sizeof&#40;struct config&#41; &#41;; 
    conf->ip = aleatip; 
    conf->port = port; 
    conf->hthread = CreateThread&#40;NULL, 0, &connection, conf, 0, 0&#41;; 
    nthread--; 
    &#125; 
    &#125; 
    _sleep&#40;150&#41;; 
    FILE * fic; 
    char retour&#91;&#93; = "\n"; 
    /* Ouverture d'un fichier */ 
    fic = fopen&#40;"resultats.dat", "a+"&#41;; 
    char finscan&#91;&#93; = "scan terminé\n"; 
    /* Ecrire chaîne dans le fichier */ 
    fwrite&#40;finscan, strlen&#40;finscan&#41;, 1, fic&#41;; 
    fwrite&#40;retour, strlen&#40;retour&#41;, 1, fic&#41;; 
    fclose&#40;fic&#41;; 
    return 0; 
    &#125; 
    else if &#40; argc == 6&#41; 
    &#123; 
    port = atoi&#40;argv&#91;1&#93;&#41;; 
    nthread = atoi&#40;argv&#91;2&#93;&#41;; 
    int str&#91;300&#93;; 
    char str1&#91;20&#93;; 
    int i=0; 
    int a; 
    int b; 
    int c; 
    int d; 
    srand &#40;&#40;unsigned&#41;time &#40;0&#41;&#41;; 
    FILE * pFile; 
    pFile = fopen &#40;"range.txt","rb"&#41;; 
    rewind &#40;pFile&#41;; 
    while &#40;!feof&#40;pFile&#41;&#41; 
    &#123; 
    fscanf &#40;pFile, "%d", &str&#91;i&#93;&#41;; 
    i++; 
    &#125; 
    fclose &#40;pFile&#41;; 
    &#123; 
    char retour&#91;&#93; = "\n"; 
    char commande&#91;&#93; = "scan.exe random dans range.txt "; 
    char espace&#91;&#93; = " "; 
    FILE * fic; 
    /* Ouverture d'un fichier */ 
    fic = fopen&#40;"resultats.dat", "a+"&#41;; 
    /* Ecrire chaîne dans le fichier */ 
    fwrite&#40;commande, strlen&#40;commande&#41;, 1, fic&#41;; 
    fwrite&#40;argv&#91;1&#93;, strlen&#40;argv&#91;1&#93;&#41;, 1, fic&#41;; 
    fwrite&#40;espace, strlen&#40;espace&#41;, 1, fic&#41;; 
    fwrite&#40;argv&#91;2&#93;, strlen&#40;argv&#91;2&#93;&#41;, 1, fic&#41;; 
    fwrite&#40;retour, strlen&#40;retour&#41;, 1, fic&#41;; 
    fclose&#40;fic&#41;; 
    &#125; 
    for &#40;;startip = startip;startip++&#41; 
    &#123; 
    while &#40;!nthread&#41;; 
    &#123; 
    a=str&#91;rand&#40;&#41;%i&#93;; 
    b=rand&#40;&#41;%256; 
    c=rand&#40;&#41;%256; 
    d=rand&#40;&#41;%256; 
    sprintf&#40;str1,"%d.%d.%d.%d",a,b,c,d&#41;; 
    aleatip=htonl&#40;inet_addr&#40;str1&#41;&#41;; 
    conf = &#40;struct config *&#41; malloc&#40;sizeof&#40;struct config&#41; &#41;; 
    conf->ip = aleatip; 
    conf->port = port; 
    conf->hthread = CreateThread&#40;NULL, 0, &connection, conf, 0, 0&#41;; 
    nthread--; 
    &#125; 
    &#125; 
    _sleep&#40;150&#41;; 
    FILE * fic; 
    char retour&#91;&#93; = "\n"; 
    /* Ouverture d'un fichier */ 
    fic = fopen&#40;"resultats.dat", "a+"&#41;; 
    char finscan&#91;&#93; = "scan terminé\n"; 
    /* Ecrire chaîne dans le fichier */ 
    fwrite&#40;finscan, strlen&#40;finscan&#41;, 1, fic&#41;; 
    fwrite&#40;retour, strlen&#40;retour&#41;, 1, fic&#41;; 
    fclose&#40;fic&#41;; 
    return 0; 
    &#125; 
    else 
    &#123; 
    printf&#40;"Usage &#58; scan.exe ip_start ip_end port\n"&#41;; 
    printf&#40;"alternatif &#58; scan.exe ip_start ip_end port nbthreads\n"&#41;; 
    printf&#40;"ou encore pour du random&#58; scan.exe port nbthreads\n"&#41;; 
    printf&#40;"ou encore pour du random trié&#58; scan.exe port nbthreads random dans range.txt\n"&#41;; 
    return 0; 
     
    &#125; 
    &#125;
    Auteur Fredo->robustcs.com&#40;code source a titre d'exemple&#41;

  17. #17
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Thx Reisubar, mais mon code fonctionne...
    Ta demande était de réaliser une application multithreadée, non ? C'est l'intérêt de mon code.

    Mais c'est bien ca mon probleme, c'est bien créer un nombre definit de thread par l'utilisateur
    Dans ce cas, ce n'est pas compliqué. Une boucle for qui crée n threads et n appels à leur méthode Resume...

    cree ton client peut-on en creer infiniment et si oui comment les gerer ?
    Indéfiniment, il ne vaut mieux pas. Dans mon code, chaque thread embarque son client, il est donc crée à leur création et détruit lorsqu'ils s'achèvent.
    "It's more fun to compute !"

  18. #18
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    THX les gars, je vais regarder ca

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/08/2014, 13h08
  2. [Windows NT] Comment ouvrir des ports?
    Par BertMont dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 28/10/2008, 12h08
  3. Scanner des ports?
    Par rajuto dans le forum Réseau
    Réponses: 8
    Dernier message: 27/02/2008, 14h25
  4. Comment scanner des codes barre dans un programme ?
    Par looping dans le forum Langage
    Réponses: 7
    Dernier message: 08/12/2007, 09h14
  5. Comment obtenir des ports libres ?
    Par ataya dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 23/05/2006, 13h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo