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

C Discussion :

Indication Programme C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Indication Programme C
    Bonjour,

    Je suis sur un exercice concernant les client/serveur TCP sous Unix et j'ai cela sous les yeux :

    http://img833.imageshack.us/img833/6322/22222q.png

    J'ai par la suite plusieurs questions mais ce n'est pas le soucis, je souhaiterai juste avoir quelques indications pour comprendre ce script C car je suis totalement perdu

    Voila sur ce que je m'avance, dans le doute

    Dans un 1er temps, le socket est déclaré
    Il convertit l'adresse ip, le protocole et le port en format "réseau" et se connecte au serveur de socket
    (je ne comprends pas le vérification du "if" à la fin du int main)

    Dans le void

    Lit le fichier et envoie les données au serveur de socket et vérifie que les données sont bien envoyes sinon un message d'erreur

    Qu'en pensez-vous ?

    Merci

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 845
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 845
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par br3yton Voir le message
    Dans un 1er temps, le socket est déclaré
    Il convertit l'adresse ip, le protocole et le port en format "réseau" et se connecte au serveur de socket
    Salut
    C'est exact. J'espère que tu sais à quoi sert le format "réseau" sinon tu le dis et je t'explique.

    Citation Envoyé par br3yton Voir le message
    (je ne comprends pas le vérification du "if" à la fin du int main)
    Il vérifie si le 3° paramètre est la chaine "stdin". Si c'est le cas, il prendra ses infos du clavier. Sinon il considère que ce 3° paramètre est un nom de fichier dont il faut envoyer le contenu sur la socket.

    Citation Envoyé par br3yton Voir le message
    Dans le void
    Dans la fonction str_xxx !!!

    Citation Envoyé par br3yton Voir le message
    Lit le fichier et envoie les données au serveur de socket et vérifie que les données sont bien envoyes sinon un message d'erreur
    Presque. Il lit une ligne du fichier (qui peut aussi être le clavier), envoie le contenu sur la socket, lit ensuite ce qui en vient (présuppose que de l'autre coté il y a un programme analogue qui lit la socket puis y envoie des datas) et affiche ce qu'il a lu puis recommence tant que tout le fichier (ou le clavier) n'a pas été entièrement traité.
    Si lecture socket échouée, alors il affiche un message d'erreur signifiant grosso-modo "le correspondant a raccroché" et quitte le programme (ce qui est assez horrible car un des principes de programmation C veut que toute fonction appelée remonte toujours sur l'appelant quoi qu'il arrive).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Invité
    Invité(e)
    Par défaut
    Meci de ta reponse,.

    Concernant le format reseau, je penses à un format "classique" d'une adresse IP, EN X.X.X.X

    petite question : quant tu parles de "au clavier" ke veut tu dire exactement ? L'utilisateur saisie au clavier ?

    Pour le probleme de "raccrochage a la brute", il suffirait de rajouter different controle a chaque ligne lu par le serveur et envoi d'une confirmation au client non ?

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 845
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 845
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par br3yton Voir le message
    Meci de ta reponse,.

    Concernant le format reseau, je penses à un format "classique" d'une adresse IP, EN X.X.X.X
    Non. Ca c'est une adresse IP. Ca n'a rien à voir.
    Cela vient du codage interne des entiers qui, sur certains systèmes, sont codés dans le sens de lecture, et sur d'autres sont codés par blocs inverses.
    Exemple: tu as le nombre 12345678
    Sur un système X, il sera codé comme tu le lis => 12345678
    Sur un système y, il sera découpé en blocs et chaque bloc sera inversé => 34127856
    C'est ce qu'on nomme "big-endian/little-endian" ou plus simplement l'endianess.

    Et donc il a été rajouté un "neutre" et uniforme nommé "format réseau". Ainsi, si tu veux envoyer un entier via le réseau, te faudra
    1) le convertir via htons (host to net short) ou htonl (host to net long)
    2) envoyer le nombre converti sur le réseau
    3) le récupérer de l'autre coté
    4) le reconvertir via ntohs (net to host short) ou ntohl (net to host long)

    Or, le champ "sin->port" de la structure truc chose veut un nombre converti au format intermédiaire "réseau".

    Citation Envoyé par br3yton Voir le message
    petite question : quant tu parles de "au clavier" ke veut tu dire exactement ? L'utilisateur saisie au clavier ?
    Pour Unix, le clavier est un fichier comme un autre. La variable stdin est de type FILE* et tu peux lire son contenu via fgets().

    Donc dans ce code, si tu entres le mot clef "stdin", le programme ira prendre ses datas dans le buffer clavier (sous-entendu dans la frappe de l'utilisateur qui pourra se laisser aller à taper sa vie s'il le souhaite).
    Si tu entres autre chose, alors il considèrera que tu lui as donné un nom de fichier. Dans ce cas, il ouvrira le fichier ce qui lui renverra un buffer "FILE *" et le programme prendra alors ses infos directement dans le fichier.

    Citation Envoyé par br3yton Voir le message
    Pour le probleme de "raccrochage a la brute", il suffirait de rajouter different controle a chaque ligne lu par le serveur et envoi d'une confirmation au client non ?
    Imagine toi en train de téléphoner à un pote. Et ton pote raccroche et toi tu me dis "ben suffirait qu'on lui demande de confirmer chaque ligne lue". Mais comme de toute façon il a raccroché...
    La façon dont ça a été codé est la meilleure possible. Enfin presque car il peut très bien ne rien lire parce que le flux est vide donc en fait, il faudrait jute rajouter un test sur errno pour lever le doute.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Invité
    Invité(e)
    Par défaut
    Désolé de la réponse si tardive,

    Mais je te remercie bien de tes explications, je penses que c'est ok de mon coté

    Merci encore !

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 845
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 845
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par br3yton Voir le message
    Désolé de la réponse si tardive,
    Oui ben on n'est pas obligé de se répondre dans la minute non plus. C'est ça les forum. Quand on y est on répond et quand on n'y est pas...

    Citation Envoyé par br3yton Voir le message
    Mais je te remercie bien de tes explications, je penses que c'est ok de mon coté
    Pas de pb. Tu peux télécharger mon tuto sur le tcp/ip ici http://fr.lang.free.fr/cours/SocketCsyst_v1.0.pdf qui explique ça de façon plus générale

    Citation Envoyé par br3yton Voir le message
    Merci encore !
    A+
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/08/2011, 11h24
  2. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  3. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  4. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

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