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

Langage C++ Discussion :

[Abstraction de structure C] SocketApi


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Par défaut [Abstraction de structure C] SocketApi
    Bonjour,

    je travail aujourd'hui sur une abstraction des sockets (C) et des Apis reseaux en general (unix/windows) et j'ai eu une idee que j'aimerais exploiter mais j'aurais besoin de votre savoir a tous

    j'aimerais faire un heritage de structure, en l'occurence la structure sockaddr_in.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <netinet/in.h>
     
    struct sockaddr_in {
        short            sin_family;   // e.g. AF_INET
        unsigned short   sin_port;     // e.g. htons(3490)
        struct in_addr   sin_addr;     // see struct in_addr, below
        char             sin_zero[8];  // zero this if you want to
    };
     
    struct in_addr {
        unsigned long s_addr;  // load with inet_aton()
    };
    J'ai donc commencer a coder une jolie structure mais je ne sais pas comment
    initializer les variables de la structure dont j'herite,

    _ etant donner que ce sont des structures issue du C, elles n'ont pas de constructeur, donc on oublie

    _ La solution serait de faire une method plutot que d'utiliser le constructeur

    Si vous aviez une solution pour utiliser l'initalisation du constructeur ca serait super.
    (il est vrai que plutot que de refaire une method, je pourrais faire comme dans l'overload de l'operateur =)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    struct		Asockaddr_in : public sockaddr_in {
     
    Asockaddr_in(const short family, const unsigned short port,
    			 const Saddr addr, const char* zero)
    			: sin_family(family), sin_port(port),
    				sin_addr(addr), sin_zero(zero) {}
     
    const Asockaddr_in& Asockaddr_in::operator=(const Asockaddr_in& from) {
    	if (this != &from) {
    		this->sin_family = from.sin_family;
    		this->sin_port = from.sin_port;
    		this->sin_addr = from.sin_addr;
    		this->sin_zero = from.sin_zero;
    	}
    	return *this;
    }
     
    };

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Tu ne peux pas utiliser la liste d'initialisations, mais tu peux utiliser le corps du constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct		Asockaddr_in : public sockaddr_in {
     
    Asockaddr_in(const short family, const unsigned short port,
    			 const Saddr addr, const char* zero) {
      sin_family = family;
      sin_port = port;
      sin_addr = addr;
      sin_zero = zero;
    }
    MAT.

  3. #3
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Par défaut
    Hello Mat007,

    merci de ta reponse et effectivement, je ne vais pas pouvoir utiliser la liste d'initialisation.

    Je vais poursuivre simplement. Merci encore

  4. #4
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Par défaut
    Erreur d'aveugle ...

    Il s'avere finalement que le polymorphism fonctionne.
    J'ai mal interpreter l'erreur de compilation.

    Le polymorphism fonctionne, et il s'averrais qu'il fallait caster sockaddr_in en sockaddr, un cast classic a faire en C.

    EDIT : ce post repond a un post que je n'ai pas poster sur le fofo xD dsl les admins.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par blazed Voir le message
    Erreur d'aveugle ...

    Il s'avere finalement que le polymorphism fonctionne.
    J'ai mal interpreter l'erreur de compilation.

    Le polymorphism fonctionne, et il s'averrais qu'il fallait caster sockaddr_in en sockaddr, un cast classic a faire en C.

    EDIT : ce post repond a un post que je n'ai pas poster sur le fofo xD dsl les admins.
    Ca m'a l'air très suspect comme cast. Tu peux montrer le code ?

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Non franchement, c'est un classique.
    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.

  7. #7
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Par défaut
    Voici mon code, mais rien de tres surprenant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    //
    // Abstraction de la structure C sockaddr_in
    //
     
    #ifndef		ASOCKADDR_IN_H_
    # define	ASOCKADDR_IN_H_
     
    # ifdef WIN32
    #  include <winsock2.h>
    # elif defined LINUX
     
    # endif
     
    struct		Asockaddr_in : public sockaddr_in {
     
    	typedef struct in_addr Saddr;
     
    	Asockaddr_in(const short, const unsigned short,
    		const unsigned long, const char*);
    	Asockaddr_in(const Asockaddr_in&);
    	~Asockaddr_in();
    	const Asockaddr_in&	operator=(const Asockaddr_in&);
     
    	const short getFamily() const;
    	const unsigned short getPort() const;
    	const Saddr getAddr() const;
    	const char* getZero() const;
    	char* getZero();
     
    private :
     
    	Asockaddr_in();
     
    };
     
    #endif	// !ASOCKADDR_IN_H_
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //
    // La methode ou ce produit le cast
    //
     
    void NetworkApi::Mybind(int sockfd, Asockaddr_in* addr) {
    	if ((int error = bind(sockfd, (struct sockaddr*)addr, sizeof((struct sockaddr_in*)addr)))) {
                 throw MyException(error);
            }
    }

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Effectivement, c'est un cas de cast classique comme dit par médinoc.
    Si ce n'est que :
    reinterpret_cast<struct sockaddr*>(addr) : c'est plus C++ que les cast à la C

    sizeof((struct sockaddr_in*)addr) : c'est la taille d'un pointeur. Tu dois probablement passer : sizeof(struct sockaddr_in) qui suffit.

    if ((int error = : ce n'est pas du C++ standard : il me semble qu'on ne peut pas définir une variable dans un if.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private : 
    	Asockaddr_in();
    A partir du moment où tu définis au moins un constructeur autre que le constructeur par copie (et c'est le cas dans ta classe), le constructeur par défaut n'est pas générer. Donc nul besoin de le mettre en privé. Autant ne pas le déclarer dans ta classe.

    Ta classe telle que tu la présentes n'a pas besoin d'un constructeur par copie ni d'un opérateur =. Leur implémentation par défaut doit probablement suffire.

    => F.A.Q. Quand dois-je définir un constructeur par défaut ? et les suivantes

    Quel est l'intérêt des accesseurs ?

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

Discussions similaires

  1. Probleme d'abstraction sur structure
    Par karasnake dans le forum C++/CLI
    Réponses: 1
    Dernier message: 08/06/2010, 15h25
  2. recuperation de la structure d'une base
    Par pascalT dans le forum 4D
    Réponses: 7
    Dernier message: 07/06/2006, 15h32
  3. Structure de données de type "RECORD"
    Par chaours dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/09/2002, 17h10
  4. Abstract VS virtual
    Par LE CHAKAL dans le forum Langage
    Réponses: 2
    Dernier message: 29/08/2002, 17h50
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 18h31

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