begin process at 2012 05 29 18:49:53
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Réseau & Internet

 > 

pb de redirection


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

pb de redirection

lundi 25 juin 2007 à 11:04:51 | pb de redirection

grums45

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

mardi 26 juin 2007 à 16:52:14 | Re : pb de redirection

katsankat

Membre Club
Réponse acceptée !
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.
mercredi 27 juin 2007 à 11:38:35 | Re : pb de redirection

grums45

Merci de tout coeur de votre aide
Bonne continuation,grums


Cette discussion est classée dans : printf, socket, tcp, strcmp, proto


Répondre à ce message

Sujets en rapport avec ce message

Probleme reception sur un serveur windows en vc++ [ par alfred ] Salut a tous!!g un probleme dans mon serveur le recv renvoie la valeur -1 et je ne vois pas pouquoi, toute mes socket sont positives le client envois Socket TCP/UDP [ par hobbes ] Bonjour,j ai cru comprendre qu il existe 2 types de sockets (TCP et UDP) pouvant permettre l echange de donnees entre 2 applications sur le reseau.Pou Raw Socket -> TCP/IP [ par krum ] Voila plus d'une semaine que je fouille/cherche sur les moteurs de recherches,les forums ..des sources,des tutos,des papers sur les raw sockets (sous erreur 10038 [ par made_in_france ] Hello ! j'ai un probleme avec la fonction bind de mon programme. En effet cette fonction me renvois l'erreur 10038 « attempted ». Est ce que quelqu'un socket winsock grrr [ par dekai ] Voilà mon pb lorsque je tente un send ou recv j'obtient une erreur et ej comprends pas pourquoi. Merci de m'aider.Voici le code (je travaille sous dev faire un timeout avec une socket TCP sur un connect() [ par bobijoe ] Salut tout le monde,ca fait pas mal de temps que je me lutte pour faire un timeout sur une demande de connexion TCP.En clair je voudrais pouvoir arret gestion des event avec WSANETWORKEVENTS [ par Spiffou ] bonjour à tous,je voudrais votre avis sur la gestion des evenements sur les sockets.je réalise une application (un jeu) qui doit communiquer sur un ré raw socket et protocole TCP/IP [ par robertmouac ] Bonjour tout le monde. Je suis en train de coder une version simplifier du protocol TCP/IP en raw socket. Je formate et deformate bien les trames (ve probleme strcmp [ par ben3020 ] Bonjour à tous Je suis nouveau ds la prog C et j'ai un probleme ave la fonction strcmp : #include #include int main(void) { int cnp; char filename demande d'aide pour un carnt d'adresses avec liste chaînée [ par titoune85 ] bonsoir à tous!je vous demande un peu de temps et beaucoup d'aide pour ce pg qui consiste a creer un carnet d'adresse classé par ordre alphabetique. J


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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 : 2,387 sec (3)

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