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

Réseau C Discussion :

Trasformer "long" en "char"


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Par défaut Trasformer "long" en "char"
    Bonjour à tous,
    Ceci est mon premier message sur le forum donc j'espère que je poste correctement (j'ai lu une partie de la FAQ et j'ai fait quelques recherches mais j'ai peut être laissé passer certaines choses)

    Je suis débutant en programmation et je dois faire un programme avec 2 machines clientes et un serveur. Les 2 machines clientes envoient (avec des sockets UDP) des nombres (pairs pour client1 et impairs pour client2 ) au serveur sur lequel un sniffer sera placé. ( c'est un programme qui testera l'efficacité du wifi lorsque le CSMA/CA est inhibé )

    Voila le principe de la partie du programme qui me pose problème:
    - Je fait un tableau de "long" avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    long* tableau = NULL;
    long nb_envoi = 10;
    tableau = malloc(nb_envoi * sizeof(long)); // On alloue de la mémoire pour le tableau
    - Je remplie le tableau avec des nombres paires:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (i = 0 ; i < nb_envoi ; i++)
            {
                tableau[i] = envoi_client +2; //envoi_client étant un "long" initialisé à 0
    	         envoi_client = envoi_client +2;	
            }
    - J'envoie chaque case du tableau l'une apres l'autre avec une socket:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (compteur = 0; compteur < nb_envoi; compteur++)
    {
                    int lg;
                    sprintf( buffer, "%ld", tableau[compteur] );  //mauvaise fonction ?
                    lg = strlen(tableau[compteur]); //probleme ici
                    sendto(sock,tableau[compteur],lg,0,(struct sockaddr *) &server,length); //et probleme ici
    }
    et gcc me met à la compilation:
    attention : passing argument 1 of ‘strlen’ makes pointer from integer without a cast
    attention : passing argument 2 of ‘sendto’ makes pointer from integer without a cast

    Donc le type n'est pas le bon. D'apres les MAN des fonctions j'ai:
    int sendto(int s, const void *chaine, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);
    et
    strlen(const char* chaine);


    et à l'exécution j'ai une erreur de segmentation

    Je pense que je n'envoie pas les bon types aux fonctions "sendto" et "strlen".
    Quelqu'un sait comment je peux passer mes valeurs du tableau de "long" à des "char" ? (le sprintf ne m'a pas aidé mais je l'ai peut être mal utilisé ... )
    et itoa n'est vraisemblablement pas supporté par GCC.

    Merci

    nb: Je compile avec gcc sous Mandriva 2008
    ...et je suis relativement mauvais en programmation (j'ai seulement fait un peu de C/C++ et du Java depuis un an) Je pense que l'erreur est assez simple mais j'ai l'impression qu'il me manque quelques bases

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    je dirais strlen(buffer) et sendto(buffer), non ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Par défaut
    Merci pour cette réponse rapide !

    Je n'ai plus les erreurs à la compilation ni à l'éxécution !
    ( à force de retourner le code dans tous les sens j'ai oublié de changer mes variables dans les fonctions )

    Par contre ma partie réception (serveur) ne m'affiche plus rien

    Je vais voir à quel endroit il peut y avoir un problème ...
    En tout cas merci beaucoup pour la réponse efficace

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Oursdeglace Voir le message
    <...>je dois faire un programme avec 2 machines clientes et un serveur. Les 2 machines clientes envoient (avec des sockets UDP) des nombres (pairs pour client1 et impairs pour client2 ) au serveur sur lequel un sniffer sera placé <...>
    Quel est le format de données attendu sur le réseau ?
    binaire ? texte ?
    Si c'est binaire, boutisme (endianness) ? largeur ?
    Si c'est texte, ASCII ?, format ligne ? Si oui, quel marqueur de fin de ligne ? CR, LF ? CRLF ? LFCR ?

  5. #5
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Quel est le format de données attendu sur le réseau ?
    binaire ? texte ?
    Si c'est binaire, boutisme (endianness) ? largeur ?
    Si c'est texte, ASCII ?, format ligne ? Si oui, quel marqueur de fin de ligne ? CR, LF ? CRLF ? LFCR ?
    ... euh a vrai dire j'en sais rien.
    Je pense ( mais je suis peut être trés loin de ce que tu attends comme réponse ... ) que je n'ai pas à m'en préoccuper parce que je travaille au niveau de la couche udp. Donc les fonctions "sendto" / "recvfrom" s'occupe de formater ce que je leur passe en arguments.
    Pour moi le "réseau" attend forcément du binaire généré par la couche physique, non ?

    Je ne sais pas si ça peut t'éclaircir mais j'utilise ces sockets là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sock=socket(AF_INET, SOCK_DGRAM, 0);
    Donc je précise juste que je suis en mode non connecté, avec des adresses de type Internet et plus loin je précise le port à utiliser dans "sin.port"

    ... excuse moi si je suis à mille lieux de ce que tu demandais ...

    nb: J'ai trouvé d'où venait le problème au niveau réception. Désormais l'application fonctionne bien en loopback mais pas sur le réseau (le serveur affiche des caractères bizarres )

    Edit:ah ... une petite recherche sur Endianness m'a permis de comprendre un peu mieux là où tu voulais en venir
    Si c'est pour l'ordre d'envoi des bytes (poids fort et poids faible) je sais qu'il peut y avoir un problème si les 2 machines n'utilise pas la même méthode. Mais je ne sais pas du tout comment on fait pour modifier ce problème. Du coup, je travaille entre une station Mandriva et une station sous Backtrack en espérant qu'elles soient identique à ce niveau.

    Edit2: C'est bon l'application fonctionne en réseau !
    Juste un petit problème avec les caractères accentués (au moins le "ç" en tout cas ) qui s'affiche mal sur le terminal Backtrack. Aucun problème sous Mandriva par contre.

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

Discussions similaires

  1. UPDATE en ajoutant un 0 sur un champ de type "char"
    Par doum2 dans le forum Requêtes
    Réponses: 1
    Dernier message: 08/03/2006, 14h22

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