begin process at 2012 02 10 16:25:25
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Applications Linux

 > NET : UTILITAIRE LINUX SOCKETS

NET : UTILITAIRE LINUX SOCKETS


 Information sur la source

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Applications Linux Niveau :Initié Date de création :07/06/2003 Date de mise à jour :07/06/2003 14:35:38 Vu :6 513

Auteur : Krox68

Ecrire un message privé
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

ce prog pour linux fait le serveur
se connecte a un serveur
scanne un hote

syntaxe :
net [hote] [port]   pour se connecter
net -l [port]          pour écouter (serveur)
net -s [hote] [port1] [port2] pour scanner du port1 au port2

Source

  • #include <stdio.h> // les includes obligatoires
  • #include <stdlib.h> // pour les sockets
  • #include <sys/types.h>
  • #include <sys/socket.h>
  • #include <netinet/in.h>
  • #include <netdb.h>
  • int connecter(char*HOST, char*PORT); // les fonctions qu'on va utiliser
  • int ecouter(char*PORT); // pour clarifier le code
  • int scanner(char*HOST,char*PORT1,char*PORT2);
  • int sock, nsock; // déclare sock et nsock pour tout le programme
  • //###############################################################################################################
  • int main(int argv, char*argc[])
  • {
  • int n;
  • if((argv < 2)||(argv > 5)) // si le nombre d'arguments n'est pas correct...
  • {
  • printf("syntaxe:\n\
  • net [hote] [port] pour se connecter a l'hote\n\
  • net -l [port] pour écouter le port (serveur)\n\
  • net -s [hote] [port1] [port2] pour scanner l'hote du port1 au port2\n");
  • return 0;
  • }
  • if((strcmp(argc[1], "-l")) == 0) // compare l'argument 1 et -l, si ils sont égaux...
  • {
  • n = 1;
  • ecouter(argc[2]); // on appelle la fonction ecouter() avec l'argument 2 (le port)
  • }
  • if((strcmp(argc[1], "-s")) == 0) // compare l'argument 1 et -s, si ils sont égaux...
  • {
  • n = 2;
  • scanner(argc[2],argc[3],argc[4]); // on appelle la fonction scanner()
  • } //avec l'argument 2 (l'hote), l'argument 3 (port1), l'argument 4 (port2)
  • if((n != 1)&&(n != 2)) // fonction par défaut
  • {
  • connecter(argc[1], argc[2]);
  • }
  • return 0;
  • }
  • //###############################################################################################################
  • int connecter(char*HOST, char*PORT)
  • {
  • char buffer[255]; // pour stocker les données que l'on va recevoir du serveur
  • struct hostent*IP; // déclare une struct IP qui contiendra l'IP de l'hote
  • if ((IP = gethostbyname(HOST)) == NULL) // on convertit l'hote en IP
  • {
  • printf("erreur IP incorrect\n");
  • return 0;
  • }
  • struct sockaddr_in sin; // déclare une struct sin qui contiendra les données nécessaires à la conection
  • sin.sin_family = AF_INET; // internet
  • sin.sin_addr = *((struct in_addr *)IP -> h_addr); //l'adresse IP
  • sin.sin_port = htons(atoi(PORT)); // le port
  • bzero(&(sin.sin_zero),8); // zéro pour le reste de la struct sin
  • if((sock = socket(AF_INET,SOCK_STREAM,0)) == -1) // on implémente sock
  • {
  • printf("erreur lors de l'initialisation de la socket\n");
  • return 0;
  • }
  • printf("tentative de connection sur %s / %s...\n",inet_ntoa(*((struct in_addr *)IP -> h_addr)),PORT);
  • if((connect(sock,(struct sockaddr*)&sin,sizeof(struct sockaddr))) == -1) // tentative de connection
  • {
  • printf("erreur lors de la connection %s / %s\n",IP,PORT);
  • return 0;
  • }
  • printf("connecté %s / %s\n",inet_ntoa(*((struct in_addr *)IP -> h_addr)),PORT);
  • if((recv(sock,buffer,sizeof(buffer),0)) == -1) // on reçoit les données du serveur et on les place dans buffer
  • {
  • printf("erreur lors de la réception des données\n");
  • return 0;
  • }
  • printf("buffer: %s\n",buffer); // on affiche le buffer
  • close(sock); // on détruit la socket
  • return 0;
  • }
  • //###############################################################################################################
  • int ecouter(char*PORT)
  • {
  • char msg[]="Bienvenue sur le serveur!"; // message qu'on enverra aux éventuels clients qui se connecteront
  • struct sockaddr_in sin; // pareil que pour le client plus haut
  • sin.sin_family = AF_INET;
  • sin.sin_addr.s_addr = INADDR_ANY; // on a pas besoin d'une adresse puisqu'on est pas client
  • sin.sin_port = htons(atoi(PORT));
  • bzero(&(sin.sin_zero),8);
  • if((sock = socket(AF_INET,SOCK_STREAM,0)) == -1)
  • {
  • printf("erreur lors de l'initialisation de la socket\n");
  • return 0;
  • }
  • if((bind(sock, (struct sockaddr *)&sin, sizeof(struct sockaddr))) == -1) // on "réserve" le port
  • {
  • printf("erreur lors de la réservation du port %s\n",PORT);
  • return 0;
  • }
  • if((listen(sock,50)) == -1) // on écoute le port
  • {
  • printf("erreur lors de l'écoute du port %s\n",PORT);
  • return 0;
  • }
  • printf("port %s en écoute...\n",PORT);
  • while(1) // boucle infini
  • {
  • int sin_size = sizeof(struct sockaddr_in);
  • if ((nsock = accept(sock,(struct sockaddr *)&sin,&sin_size)) == -1) // nsock (new sock) est un nouveau client
  • {
  • printf("erreur lors de la connection du client\n");
  • continue;
  • }
  • printf("connection de %s sur le port %s\n",inet_ntoa(sin.sin_addr),PORT);
  • if (!fork())
  • {
  • if (send(nsock,msg,sizeof(msg),0) == -1) // on essaie d'envoyer au client le message
  • {
  • printf("erreur lors de l'envoie du message\n");
  • return 0;
  • }
  • close(nsock); // détruit la socket
  • return 0;
  • }
  • close(nsock);
  • }
  • return 0;
  • }
  • //###############################################################################################################
  • int scanner(char*HOST,char*PORT1,char*PORT2) // pour scanner, pas besoin de commentaires, c'est comme le client
  • { // mais il se connecte sur plusieurs port pour les tester
  • int n; // et ne reçoit pas de données
  • struct hostent*IP;
  • if ((IP = gethostbyname(HOST)) == NULL)
  • {
  • printf("erreur IP incorrect\n");
  • return 0;
  • }
  • printf("scan de %s...\n",inet_ntoa(*((struct in_addr *)IP -> h_addr)));
  • for(n = (atoi(PORT1)); n < (atoi(PORT2)); n++)
  • {
  • if((sock = socket(AF_INET,SOCK_STREAM,0)) == -1)
  • {
  • printf("erreur lors de l'initialisation de la socket\n");
  • return 0;
  • }
  • struct sockaddr_in sin;
  • sin.sin_family = AF_INET;
  • sin.sin_addr = *((struct in_addr *)IP -> h_addr);
  • sin.sin_port = htons(n);
  • bzero(&(sin.sin_zero),8);
  • if((connect(sock,(struct sockaddr*)&sin,sizeof(struct sockaddr))) == 0)
  • {
  • printf("%i OUVERT\n",n);
  • }
  • close(sock);
  • }
  • close(sock);
  • return 0;
  • }
#include <stdio.h>          // les includes obligatoires
#include <stdlib.h>         // pour les sockets
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

int connecter(char*HOST, char*PORT);            // les fonctions qu'on va utiliser
int ecouter(char*PORT);                         // pour clarifier le code
int scanner(char*HOST,char*PORT1,char*PORT2);

int sock, nsock;    // déclare sock et nsock pour tout le programme

//###############################################################################################################

int main(int argv, char*argc[])
{
 int n;

 if((argv < 2)||(argv > 5))    // si le nombre d'arguments n'est pas correct...
 {
  printf("syntaxe:\n\
   net [hote] [port]             pour se connecter a l'hote\n\
   net -l [port]                 pour écouter le port (serveur)\n\
   net -s [hote] [port1] [port2] pour scanner l'hote du port1 au port2\n");
  return 0;
 }

 if((strcmp(argc[1], "-l")) == 0)  // compare l'argument 1 et -l, si ils sont égaux...
 {
  n = 1;
  ecouter(argc[2]);                // on appelle la fonction ecouter() avec l'argument 2 (le port)
 }

 if((strcmp(argc[1], "-s")) == 0)  // compare l'argument 1 et -s, si ils sont égaux...
 {
  n = 2;
  scanner(argc[2],argc[3],argc[4]); // on appelle la fonction scanner()
 }                                  //avec l'argument 2 (l'hote), l'argument 3 (port1), l'argument 4 (port2)


 if((n != 1)&&(n != 2))           // fonction par défaut
 {
  connecter(argc[1], argc[2]);
 }

 return 0;
}

//###############################################################################################################

int connecter(char*HOST, char*PORT)
{
 char buffer[255];     // pour stocker les données que l'on va recevoir du serveur

 struct hostent*IP;     // déclare une struct IP qui contiendra l'IP de l'hote
  if ((IP = gethostbyname(HOST)) == NULL)     // on convertit l'hote en IP
  {
   printf("erreur IP incorrect\n");
   return 0;
  }

 struct sockaddr_in sin;       // déclare une struct sin qui contiendra les données nécessaires à la conection
 sin.sin_family = AF_INET;     // internet
 sin.sin_addr   = *((struct in_addr *)IP -> h_addr);  //l'adresse IP
 sin.sin_port   = htons(atoi(PORT));     // le port
 bzero(&(sin.sin_zero),8);        // zéro pour le reste de la struct sin

 if((sock = socket(AF_INET,SOCK_STREAM,0)) == -1)   // on implémente sock
  {
   printf("erreur lors de l'initialisation de la socket\n");
   return 0;
  }

  printf("tentative de connection sur %s / %s...\n",inet_ntoa(*((struct in_addr *)IP -> h_addr)),PORT);

  if((connect(sock,(struct sockaddr*)&sin,sizeof(struct sockaddr))) == -1) // tentative de connection
  {
   printf("erreur lors de la connection %s / %s\n",IP,PORT);
   return 0;
  }

 printf("connecté %s / %s\n",inet_ntoa(*((struct in_addr *)IP -> h_addr)),PORT);

  if((recv(sock,buffer,sizeof(buffer),0)) == -1)    // on reçoit les données du serveur et on les place dans buffer
  {
   printf("erreur lors de la réception des données\n");
   return 0;
  }

 printf("buffer: %s\n",buffer);     // on affiche le buffer

 close(sock);   // on détruit la socket
 return 0;
}

//###############################################################################################################

int ecouter(char*PORT)
{
 char msg[]="Bienvenue sur le serveur!";  // message qu'on enverra aux éventuels clients qui se connecteront

 struct sockaddr_in sin;    // pareil que pour le client plus haut
 sin.sin_family      = AF_INET;
 sin.sin_addr.s_addr = INADDR_ANY; // on a pas besoin d'une adresse puisqu'on est pas client
 sin.sin_port        = htons(atoi(PORT));
 bzero(&(sin.sin_zero),8);

  if((sock = socket(AF_INET,SOCK_STREAM,0)) == -1)
  {
   printf("erreur lors de l'initialisation de la socket\n");
   return 0;
  }

  if((bind(sock, (struct sockaddr *)&sin, sizeof(struct sockaddr))) == -1)  // on "réserve" le port
  {
   printf("erreur lors de la réservation du port %s\n",PORT);
   return 0;
  }

  if((listen(sock,50)) == -1)     // on écoute le port
  {
   printf("erreur lors de l'écoute du port %s\n",PORT);
   return 0;
  }

 printf("port %s en écoute...\n",PORT);

  while(1) // boucle infini
  {
   int sin_size = sizeof(struct sockaddr_in);
    if ((nsock = accept(sock,(struct sockaddr *)&sin,&sin_size)) == -1) // nsock (new sock) est un nouveau client
    {
     printf("erreur lors de la connection du client\n");
     continue;
    }

   printf("connection de %s sur le port %s\n",inet_ntoa(sin.sin_addr),PORT);

    if (!fork())
    {
      if (send(nsock,msg,sizeof(msg),0) == -1)  // on essaie d'envoyer au client le message
      {
       printf("erreur lors de l'envoie du message\n");
       return 0;
      }

     close(nsock); // détruit la socket
     return 0;
    }
    close(nsock);
   }

 return 0;
}

//###############################################################################################################

int scanner(char*HOST,char*PORT1,char*PORT2) // pour scanner, pas besoin de commentaires, c'est comme le client
{                                            // mais il se connecte sur plusieurs port pour les tester
 int n;                                      // et ne reçoit pas de données

 struct hostent*IP;
  if ((IP = gethostbyname(HOST)) == NULL)
  {
   printf("erreur IP incorrect\n");
   return 0;
  }

 printf("scan de %s...\n",inet_ntoa(*((struct in_addr *)IP -> h_addr)));

  for(n = (atoi(PORT1)); n < (atoi(PORT2)); n++)
  {
    if((sock = socket(AF_INET,SOCK_STREAM,0)) == -1)
    {
     printf("erreur lors de l'initialisation de la socket\n");
     return 0;
    }

   struct sockaddr_in sin;
   sin.sin_family = AF_INET;
   sin.sin_addr   = *((struct in_addr *)IP -> h_addr);
   sin.sin_port   = htons(n);
   bzero(&(sin.sin_zero),8);

    if((connect(sock,(struct sockaddr*)&sin,sizeof(struct sockaddr))) == 0)
    {
     printf("%i OUVERT\n",n);
    }

   close(sock);
  }

 close(sock);
 return 0;
}

 Conclusion

je l'ai assez bien commenté
si il y a des erreurs, dites le


 Sources du même auteur

LA LIB POUR FENETRE WIN32
CLIENT-SERVEUR : DONNEES CRYPTEES XOR
SCANNER DE SERVICES
Source avec Zip UTILITAIRE RESEAU
Source avec Zip SCANNER DE PORTS OUVERTS (COMMENTÉ)

 Sources de la même categorie

Source avec une capture COLORIMÈTRE NUMÉRIQUE LINUX par valchek
Source avec Zip TRAITEMENTS D'IMAGES AU FORMAT PGM AVEC LES ALGORITHMES DE C... par lemout
Source avec Zip ALGORITHME ACO INTERFACE GTK par RyBeN
Source avec Zip COMPRESSER SES SAUVEGARDES SMSBACKUPRESTORE (ANDROID) EN C A... par ThalLab
SIMPLE SCANNER DE PORTS par Vb6Malade

Commentaires et avis

Commentaire de jsonor le 20/08/2003 15:24:19

Merci pour cette source très intéressante..
J'ai un problème cependant, c'est qu'en fait, sous linux, ca compile bien si je spécifie que c'est du C, mais pas si on compile en C++.
(je compile avec gcc).
Si je compile en C++, il me met qu'il y a une erreur de lien v0...(hormis les autres librairies qu'il faut rajouter comme cstring.h, j'ai toujours cette erreur).
Or, j'aurai besoin d'utiliser les sockets dans un programme un C++ (donc avec des classes etc...)..peux-tu m'éclairer ?
Merci d'avance

Commentaire de Ce.plusplus le 09/01/2010 22:56:55

Parce que c'est du C et pas du C++

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales