Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 10/01/2010, à 22:18

draonix

client/ serveur c++ multi-plateforme[résolu]

Bonjour,
Je suis en train de faire la programmation d'un client/serveur en C++ et celui-ci doit être multi-plateforme.
J'ai un problème lorsque dans ma classe client je tente de créer un socket (essentiel pour la communication). Les librairies que j'ai utilisées sont les suivantes :

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <iostream.h>
class Client {
       socket my_sock;
       sockaddr_in seveur_addr;
};

Lorsque je compile l'erreur s'affiche alors que lorsque j'ai cherché dans la librairies <sys/socket> socket existe:/. Quelqu'un pourrait il m'expliquer qu'est ce que je dois faire pour que ça marche.

Sinon autre question, quelles sont les autres librairies que je dois utiliser pour la communication avec Windob.
Merci :-)

Pour info, j'utilise NetBeans 6.8

Dernière modification par draonix (Le 11/01/2010, à 00:05)

Hors ligne

#2 Le 10/01/2010, à 22:35

Teofifil

Re : client/ serveur c++ multi-plateforme[résolu]

Bonsoir,
Pour les librairies la déclaration suivante devrait mieux convenir :

#include <sys/types>
#include <sys/socket>
#include <netinet/in>
#include <sys/un>
#include <stdlib>
#include <arpa/inet>
#include <iostream>

Pour info une doc simple http://www.siteduzero.com/tutoriel-3-11 … t-cin.html avec la rubrique include.

Voila ça devrait aller un peu mieux.

Hors ligne

#3 Le 10/01/2010, à 22:53

draonix

Re : client/ serveur c++ multi-plateforme[résolu]

Merci d'avoir répondu rapidement.
J'ai essayé les librairies que tu m'as conseillées mais elles ne fonctionnent pas. Sous NetBeans, il faut mettre un ".h" pour ce genre de librairie. Quand j'ai essayé cela mais ça  ne fonctionne pas du tout. T'aurais pas une autre idée ? Merci

Hors ligne

#4 Le 10/01/2010, à 22:59

Teofifil

Re : client/ serveur c++ multi-plateforme[résolu]

Autre solution :

#include "librairies.h"

Hors ligne

#5 Le 10/01/2010, à 23:14

draonix

Re : client/ serveur c++ multi-plateforme[résolu]

NetBeans ne le reconnait pas du tout :s

Hors ligne

#6 Le 10/01/2010, à 23:17

draonix

Re : client/ serveur c++ multi-plateforme[résolu]

Je viens de trouver la solutions. Dans la bibliothèque de windows, socket est définie comme une fonction et comme une structure :s. Ce qui n'est pas le cas sous linux. Du coup, il faut mettre à la place du  'socket' (structure sous windows) le type d'origine qui est un 'int' :s. Et là tout fonctionne...
Merci pour ton aide .

Hors ligne

#7 Le 11/01/2010, à 11:22

Biaryoueno

Re : client/ serveur c++ multi-plateforme[résolu]

Visiblement, Netbeans perçoit tes fichiers comme du C et pas comme du C++ car c'est Teofifil qui a raison, en C++ on déclare les librairies sans le .h la plupart du temps (sauf exceptions).

Du coup j'imagine que tu as programmé du C with classes à tous les coups et pas du véritable C++. Je n'utilise pas Netbeans donc je ne saurais pas te conseiller sur son utilisation, je programme sous des éditeurs textes.

Dernière modification par Biaryoueno (Le 11/01/2010, à 11:24)


Je vous fais mon coming out : j'avoue tout, je suis un Gnu/linuxien.

Hors ligne

#8 Le 11/01/2010, à 12:37

Karl_le_rouge

Re : client/ serveur c++ multi-plateforme[résolu]

> en C++ on déclare les librairies sans le .h la plupart du temps (sauf exceptions)
primo, les headers sans extensions sont l'apanage de la bibliothèque standard du C++ par convention (certains frameworks comme Qt offrent des headers de convenance sans extensions)
secundo, le préprocesseur ne gére pas automagiquement les extensions. Si le header possède une extension (.{h,hh,hpp,inl,xx} etc...), il faut la préciser dans la directive d'inclusion. iostream sans extension correspond à un fichier "iostream" (privilège de la SL C++), sys/socket.h est un header système en C, il correspond à un fichier "socket.h" dans un répertoire sys.
#include <sys/socket> ==> FAUX, n'existe pas
#include <sys/socket.h> ==> OK

Un aparté sur la bibliothèque standard C++, il y a deux cas:
* le sous-ensemble recouvrant la bibliothèque standard du C.
Les headers existent sous la forme classique xxx.h (dépréciée) et la nouvelle cxxx (ie: stdio.h et cstdio), la différence est que la seconde ne place plus les symbole dans le namespace global mais uniquement dans std. ===> il faut systématiquement préférer la seconde forme en C++.
* le sous-ensemble propre à C++.
Pour des raisons de compatibilité, la norme tolére l'existence des headers sous la forme xxx.h mais rien ne garantit leur conformité avec la norme actuelle (C++98), certains compilateurs ne les fournissent même plus (GCC par exemple).

La convention généralement respectée par les développeurs C++ est d'utiliser une extension pour leurs propres fichiers d'entêtes (souvent .h, parfois .hh, .hpp comme Boost, parfois .inl pour les templates etc ...).

En gros, ça doit ressembler à ça.

/* entêtes systèmes */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <arpa/inet.h>
/* entêtes bibliothèque standard C++ */
#include <iostream>
/* entêtes bibliothèque standard C */
#include <cstdlib>
/* entêtes personnels */
#include <pouet.hpp>

PS: lire la FAQ C++ maintenu par Marshall Cline, une ressource précieuse pour les débutants en C++ (et les autres également).
http://www.parashift.com/c++-faq-lite/coding-standards.html#faq-27.4

Dernière modification par Karl_le_rouge (Le 11/01/2010, à 12:40)

Hors ligne