Pb de redirection

Résolu
Signaler
Messages postés
10
Date d'inscription
jeudi 31 mai 2007
Statut
Membre
Dernière intervention
27 juin 2007
-
Messages postés
10
Date d'inscription
jeudi 31 mai 2007
Statut
Membre
Dernière intervention
27 juin 2007
-
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

Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
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.
Messages postés
10
Date d'inscription
jeudi 31 mai 2007
Statut
Membre
Dernière intervention
27 juin 2007

Merci de tout coeur de votre aide
Bonne continuation,grums