Pb de redirection

Résolu
grums45 Messages postés 10 Date d'inscription jeudi 31 mai 2007 Statut Membre Dernière intervention 27 juin 2007 - 25 juin 2007 à 11:04
grums45 Messages postés 10 Date d'inscription jeudi 31 mai 2007 Statut Membre Dernière intervention 27 juin 2007 - 27 juin 2007 à 11:38
bonjour je suis étudiant en informatique, dans le cadre d'un stage j'ai une application réseau à réaliser en c. Mon problème est le suivant suite à la compilation de mon programme lors de l'appel du programme,celui-ci s'éxécute sans rien réaliser.

Voici comment je l'éxécute: nom-programme TCP serveur 8000
Je pense que le problème doit venir de cet comparaison (         if ((argc!=2 && strcmp(argv[1],"manuelle")==0) || (argc!=5
&& strcmp(argv[2],"client")==0) || (argc!=4 &&
strcmp(argv[2],"serveur")==0))             )

Mon programme est le suivant:
#include <winsock.h> /* pour les fonctions socket...*/
#include<stdio.h>
#include<string.h>
#include <time.h>

#pragma comment(lib, "ws2_32.lib")

#define TAILLE_BUFFER 1000

//declaration des variables globales//
char proto[256];
char rep[256];
int port=10000;
char adresse_ip[255];
char msg[1000];
char buffer[1000];
char continuer[6];

int i=1;

SOCKADDR_IN information_sur_la_destination;
SOCKET id_de_la_socket;
SOCKET acceptation;

void saisie(void);
void client(int);
void serveur(void);
void ouvert(void);
void reception(void);
void envoi(void);

//côté client
void client(int mode)
{
//mode=0 si auto et mode=1 si manuelle
struct hostent *nom_serveur;

SOCKET connection;

int j;

if (mode ==1)
{
//saisie de l'adresse IP du serveur
   printf("Entrez l'adresse IP du serveur :" );
   scanf("%s",adresse_ip);
}

nom_serveur=gethostbyname(adresse_ip);

while(nom_serveur==NULL)
    {
        perror("adresse non valide" );

        printf("Entrez l'adresse IP du serveur :" );

        scanf("%s",adresse_ip);
   
        nom_serveur=gethostbyname(adresse_ip);
    }

    information_sur_la_destination.sin_port                    = htons(port);
    information_sur_la_destination.sin_family                = AF_INET;
    information_sur_la_destination.sin_addr.s_addr            = inet_addr(adresse_ip);

    if (strcmp(proto,"t")==0||strcmp(proto,"tcp")==0)
    {

    connection=connect(id_de_la_socket, (SOCKADDR*)&information_sur_la_destination,TAILLE_BUFFER );
           
                    if (connection!=0)
                    {
                        printf("Desole, je n'ai pas pu ouvrir la session TCP : %d %d\n",connection,WSAGetLastError());
                    }
               
                   
        }   

    envoi();

}

void envoi()
{

int c_envoi_tcp;
int c_envoi_udp;

FILE * myfile;
myfile = fopen("vitesse_réseau.txt", "w+");

while (i<15)
{

    char *dispo=malloc (sizeof (*dispo)*256);
    if(dispo==NULL)
        {   
            printf("%ld \n",WSAGetLastError());
        }

    if (strcmp(proto,"u")==0||strcmp(proto,"udp")==0)
        {//envoi d'un message dans la connexion UDP//
   
            clock_t a=clock();
           
            c_envoi_udp=sendto(id_de_la_socket,msg,300,0,(SOCKADDR*)&information_sur_la_destination,TAILLE_BUFFER );

                if(c_envoi_udp!=INVALID_SOCKET)
                    {
                        printf("%i \n",c_envoi_udp);
                   
                       
                    }
               
                else
                    {   
                   
                        printf("%ld \n",WSAGetLastError());
                    }
               
            printf ("duree= %f sec\n",(clock()-a)/CLOCKS_PER_SEC);
            fprintf (myfile, "proto: %s,port: %i,msg: %i,temps: %f secondes \n",proto,port,c_envoi_udp,(clock()-a)/CLOCKS_PER_SEC);
        }
   
   
    else
        {//envoi d'un message dans la connexion TCP//
             
             clock_t a=clock();
           
           
            c_envoi_tcp=send(id_de_la_socket,dispo,TAILLE_BUFFER, 0);
               
                if(c_envoi_tcp!= INVALID_SOCKET)
                    {
                        printf("%i \n",c_envoi_tcp);
                   
                       
                    }
           
                else
                    {
                        printf("%ld \n",WSAGetLastError());
                    }
       
            printf ("duree= %f sec\n",(clock()-a)/CLOCKS_PER_SEC);
            fprintf (myfile, "proto: %s,port: %i,msg: %i,temps: %f secondes\n",proto,port,c_envoi_tcp,(clock()-a)/CLOCKS_PER_SEC);

            free(dispo);
           
        }   

i++;       
}

       
fclose(myfile);   

}

//côté serveur
void serveur()
{
SOCKET id_de_la_nouvelle_socket; // Identifiant de la nouvelle socket
SOCKADDR_IN information_sur_la_source; // Déclaration de la structure des informations lié à l'écoute
SOCKET ouverture;
SOCKET ecoute;

int tempo;

printf("test dkfsjdqkhf");
   
 //entrer dans la connexion  TCP et UDP//
    information_sur_la_destination.sin_addr.s_addr            = htonl(INADDR_ANY);;
    information_sur_la_destination.sin_family                = AF_INET;
    information_sur_la_destination.sin_port                    = htons(port);
   
    ouverture=bind(id_de_la_socket, (SOCKADDR *) &information_sur_la_destination, TAILLE_BUFFER );
       
        if (ouverture!=0)
            {
                printf("Desole, je ne peut pas ecoute la session TCP : %d %d\n",ouverture,WSAGetLastError());
            }

   
    if (strcmp(proto,"t")==0||strcmp(proto,"tcp")==0)
    {//connexion TCP//
   
        ecoute=99; // Initiation de erreur pour être sur que l'on va rentrer dans la boucle
       
        while(ecoute!=0) // Boucle tant qu'une demande de session (SYN) tcp n'a pas été reçu
            {
                ecoute=listen(id_de_la_socket,1);
            printf("ecoute ok");
            }
   
    tempo= sizeof (information_sur_la_source);
       
        acceptation=accept(id_de_la_socket,(SOCKADDR*)&information_sur_la_source,&tempo);
       
        if (acceptation != INVALID_SOCKET)
            {
                printf ("Le client est connecte a la socket %d sur %s:%d\n"
                ,acceptation
                ,inet_ntoa (information_sur_la_source.sin_addr)
                ,htons (information_sur_la_source.sin_port));
            }
    }
           
       
   

        reception();         
       
   
}

void reception()
{

int s_recpt_tcp;
int s_recpt_udp;
int control1;

while (i<15)

{

//reception TCP
    if (strcmp(proto,"t")==0||strcmp(proto,"tcp")==0)
        {
            s_recpt_tcp=recv(acceptation,buffer,sizeof(buffer), 0);
                if(s_recpt_tcp!=INVALID_SOCKET)
                    {
                        printf("%i \n",s_recpt_tcp);
                   
                    }
                   
                else
                    {
                        printf("%ld \n",WSAGetLastError());
               
                    }

        }

//reception UDP
    else
        {
            control1=sizeof(information_sur_la_destination);
         
            s_recpt_udp=recvfrom (id_de_la_socket,buffer,301,0,(SOCKADDR*)&information_sur_la_destination,&control1);
                   
                if(s_recpt_udp!=INVALID_SOCKET)
                    {
                        printf("%i \n",s_recpt_udp);
   
                    }
                   
                else
                    {
                        printf("%ld \n",WSAGetLastError());
                   
                    }
        }
i++;
}
       
       
}

//ouverture des sockets//
void ouvert()
{
    if (strcmp(proto,"u")==0||strcmp(proto,"udp")==0)
    {
               id_de_la_socket=socket(AF_INET,SOCK_DGRAM,0);
          
           if (id_de_la_socket == INVALID_SOCKET)
           {
          
                   printf("%ld \n",WSAGetLastError());
          
               }
   
          printf("serveur ou client  UDP");
    }
   
   
    else
    {
        if (strcmp(rep,"c")==0||strcmp(rep,"client")==0)
        {
            id_de_la_socket = socket (AF_INET, SOCK_STREAM, 0);
           
                if (id_de_la_socket == INVALID_SOCKET)
                {
               
                printf("%ld \n",WSAGetLastError());
               
                }
        printf("client TCP");
        }
   
   
        else
        {
       
            id_de_la_socket=socket(AF_INET,SOCK_STREAM,0);
           
                if (id_de_la_socket == INVALID_SOCKET)
                {
               
                printf("%ld \n",WSAGetLastError());
               
                }
               
            printf("serveur TCP");
        }
   
    }
}

//saisie de l'utilisateur//
void saisie()
{

//demande du protocole//
printf("protocole(udp ou tcp):");

scanf("%s", &proto);
   
    while ((strcmp(proto,"u")!=0&&strcmp(proto,"udp")!=0)&&(strcmp(proto,"t")!=0&&strcmp(proto,"tcp")!=0))
    {
        printf("veuillez entrez une valeur correct (udp ou tcp)\n");
       
        scanf("%s",&proto);
    }
   
   
   
//demande du poste//
printf("poste client ou serveur:");

scanf("%s", &rep);
   
    while ((strcmp(rep,"c")!=0&&strcmp(rep,"client")!=0)&&(strcmp(rep,"s")!=0&&strcmp(rep,"serveur")!=0))
    {
        printf("veuillez entrez une valeur correct(Client ou Serveur)\n");
       
        scanf("%s",&rep);
    }

//port d'ecoute//
printf("port:");

scanf("%i", &port);
    if (port==0)
        {
            port=10000;
        }
   
   
}

//fonction principale//
int main(int argc, char* argv[] )
{
int demarrage,mode,i;

WSADATA WSAData;

for (i=1;i<argc;i++)
 {
  if (strlen (argv[i])<0)
     {
        strcpy (argv[i],"test");
     }                  
 }
if ((argc!=2 && strcmp(argv[1],"manuelle")==0) || (argc!=5 && strcmp(argv[2],"client")==0) || (argc!=4 && strcmp(argv[2],"serveur")==0))
   {
    printf ("\nmain2 - 2007 - Damien Schaeffer");       
    printf ("\n-------------------------------");       
    printf ("\nSyntaxe main2 [protocole place port [@IP]]||[manuelle]");               
    printf ("\n\n\t - protocole = TCP || UDP");               
    printf ("\n\t - place     = serveur || client");                       
    printf ("\n\t - port      = entre 5000 et 10000");                                    
    printf ("\n\t - [@IP]   = adresse  IP destination.Uniquement valable pour le client");   
    printf ("\n\n mettez juste  "manuelle" si vous souhaitez rentrer les donnees via le programme");   
       
                                       
     return 0;
   }
demarrage=WSAStartup(MAKEWORD(2,0), &WSAData);
   
    if(demarrage!=0)
    {
        printf("%ld \n",WSAGetLastError());
        return 0;
    }

strcpy (proto,argv[1]);
strcpy (rep , argv[2]);
port =(int) argv[3];
strcpy (adresse_ip, argv[4]);
   

   
   
   
   

if (strcmp (argv[1],"manuelle")==0)
   {
           mode=1;
   }
else
   {
           mode=0;
   }  
    if (strcmp(argv[1],"manuelle")==0)
       {
          saisie();
       }

    ouvert();

        if (strcmp(argv[2],"s")==0||strcmp(argv[2],"serveur")==0)
            {
            serveur();
            }
        else
            {
            client(mode);
            }

   

    closesocket(id_de_la_socket);
   
   
system("pause");

WSACleanup();

return 0;
}

Merci d'avance de votre aide.Grums45

2 réponses

katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
26 juin 2007 à 16:52
Salut,
Dans le point d'entrée il y a un problème dans la gestion des arguments de ligne de commande.

Remplacer variable globale
char proto[256];
par
char *proto;
puis dans le main mettre simplement
proto = argv[2]

Ca évite un strcpy() inutile.

Problème ici:
port =(int) argv[3];

Ce cast retournerait n'importe quoi. Utiliser atoi() ou strtol(). D'ailleurs le port n'est pas un int mais unsigned short.

Le gros problème est là :
  strcpy (proto,argv[1]);
  strcpy (rep , argv[2]);
  port =(int) argv[3];
  strcpy (adresse_ip, argv[4]);

Si un des argv[] n'est pas renseigné ça plante. Par exemple si l'utilisateur ne donne qu'un seul argument! Si si, ils le font!

Jettes un oeil là-dessus

#include <stdio.h>
#include <string.h>

char *proto;
char *rep;
unsigned short port;
char *adresse_ip;

void show_usage()
{
  puts ("Synopsis [protocole place port [@IP]]||[manuelle]");
}

void parse_args(int argc, char **argv)
{
  proto      = NULL;
  rep        = NULL;
  port       = 10000;
  adresse_ip = NULL;

  if (argc==2 || argc==3 || argc>5)
  {
    show_usage();
    return;
  }

  if (argc==1)
  {
    puts("  methode manuelle par defaut");
    //saisie();
  } 
  else if (argc>2 && argc<6)
  {
    proto = argv[1];
    printf("proto: [%s]\n",proto);

    rep   = argv[2];
    printf("role : [%s]\n",rep);
    // Les valeurs sont acquises, décide quoi faire
    if (strcmp(rep,"s")==0 || strcmp(rep,"serveur")==0)
    {
     puts("     SERVEUR");
     //serveur();
    }
    else
    {
      puts("     CLIENT");
      //client();
    }

    port = atoi(argv[3]);
    printf("port : [%d]\n",port);

    if (argc==5)
    {
      adresse_ip =  argv[4];
      printf("ip : [%s]\n",adresse_ip);
    }
  }
}

int main(int argc, char* argv[])
{
  parse_args(argc, argv);
  getchar();
  return 0;
}

Tester cette portion sans argument, puis avec 1,2,3,4,5 arguments.
3
grums45 Messages postés 10 Date d'inscription jeudi 31 mai 2007 Statut Membre Dernière intervention 27 juin 2007
27 juin 2007 à 11:38
Merci de tout coeur de votre aide
Bonne continuation,grums
0