Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CLASSE CLIENT TYPE NORMAL OU CRYPTE (SSL) WINDOWS/LINUX


Information sur la source

Catégorie :Réseaux & Internet Classé sous : socket, client, ssl, serveur Niveau : Initié Date de création : 05/06/2005 Date de mise à jour : 07/01/2007 23:25:25 Vu / téléchargé: 7 973 / 905

Note :
4 / 10 - par 1 personne
4,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note

Description

Une classe "client" qui sert à se connecter à un serveur qui utilise une connexion  soit normale soit cryptée. C'est au choix. Cette classe va de paire avec une autre classe récemment publiée sur le site : la classe serveur (vous avez vu, bien trouvé le nom !) disponible ici http://www.cppfrance.com/code.aspx?id=31155
Les foctions de cette classe sont documentées dans le code.
 

Source

  • /***************************************************************************
  • server - description
  • -------------------
  • begin : jeu oct 28 2004
  • copyright : (C) 2004 by neoTHGLF
  • email : neoTHGLF.neoTHGLF@laposte.net
  • ***************************************************************************/
  • /***************************************************************************
  • * *
  • * This program is free software; you can redistribute it and/or modify *
  • * it under the terms of the GNU General Public License as published by *
  • * the Free Software Foundation; either version 2 of the License, or *
  • * (at your option) any later version. *
  • * *
  • ***************************************************************************/
  • #ifndef CLIENT_H
  • #define CLIENT_H
  • #include <iostream>
  • #include <string>
  • #include <openssl/ssl.h>
  • #ifdef WIN32
  • #include <winsock2.h>
  • typedef int socklen_t;
  • #pragma comment(lib,"ws2_32.lib")
  • #pragma comment(lib,"ssleay32.lib")
  • #pragma comment(lib,"libeay32.lib")
  • #else
  • #include <sys/types.h>
  • #include <sys/socket.h>
  • #include <netdb.h>
  • #include <netinet/in.h>
  • #endif
  • using std::cout;
  • using std::cin;
  • using std::endl;
  • using std::flush;
  • using std::string;
  • /**
  • @author neoTHGLF
  • */
  • class client{
  • public:
  • int client_set(short client_sin_family,char *adresse,int port,bool ssl_server); //Make the skeleton of the client
  • int client_connect();
  • int client_write(char *msg);
  • int client_read(char *msg);
  • int client_get_fd();
  • SSL *client_get_SSL_fd();
  • char *convert(string str);
  • private:
  • #ifdef WIN32
  • SOCKET fd;
  • #else
  • int fd;
  • #endif
  • SSL *SSL_fd; /* SSL socket */
  • struct sockaddr_in server_addr;
  • int client_len;
  • int SSL_error_code; /* SSL functions returns*/
  • bool server_ssl_state;
  • };
  • #endif
/***************************************************************************
                          server  -  description
                             -------------------
    begin                : jeu oct 28 2004
    copyright            : (C) 2004 by neoTHGLF
    email                : neoTHGLF.neoTHGLF@laposte.net
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/
#ifndef CLIENT_H
#define CLIENT_H

#include <iostream>
#include <string>
#include <openssl/ssl.h>

#ifdef WIN32
	#include <winsock2.h>
	typedef int socklen_t;
	#pragma comment(lib,"ws2_32.lib")
	#pragma comment(lib,"ssleay32.lib")
	#pragma comment(lib,"libeay32.lib")
#else
	#include <sys/types.h>
	#include <sys/socket.h>
	#include <netdb.h>
	#include <netinet/in.h>
#endif


using std::cout;
using std::cin;
using std::endl;
using std::flush;
using std::string;

/**
@author neoTHGLF
*/
class client{
public:

    int client_set(short client_sin_family,char *adresse,int port,bool ssl_server); //Make the skeleton of the client
	int client_connect();
	int client_write(char *msg);
	int client_read(char *msg);
    int client_get_fd();
    SSL *client_get_SSL_fd();

	char *convert(string str);   

private:

#ifdef WIN32
	SOCKET fd;
#else
	int fd;
#endif

    SSL *SSL_fd;		/* SSL socket */
    
    struct sockaddr_in server_addr;
    int client_len; 
	int SSL_error_code;								/* SSL functions returns*/
	bool server_ssl_state;
    
};

#endif

Conclusion

Si jamais il subsiste des bugs, que vous trouvez que j'ai mal documenté ou que j'ai fait des erreurs de documentation, faites m'en part, je corrigerais. Je suis ouvert à toute suggestion.
Cordialement.

ps : le code entier est ds le zip. Le code présenté à l'écran est le code contenu dans l'header : client.h.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

07 janvier 2007 23:25:25 :
Simplement une mise à jour des mots clés

Commentaires et avis

signaler à un administrateur
Commentaire de Nebula le 06/06/2005 02:06:58

Salut, pas mal du tout. Par contre l'utilisation de SSLv23_client_method n'est pas recommandée pour un client (sauf si tu désactives SSLv2 avec SSL_CTX_set_options ou SSL_set_options avant), car ce protocole comporte de multiples failles toujours actives car inhérentes à sa conception même... SSLv3 et TLSv1 sont les standards actuels ;-)

Un autre truc (je dis tout de suite que je ne fais pas de C++ mais du C, mais çà doit être valable quand même) : la gestion des erreurs est intégrée dans ta classe, ne serait-il pas préférable de déclencher des exceptions (méthode préférée du C++ il me semble) ?

signaler à un administrateur
Commentaire de Nebula le 06/06/2005 02:20:15

En relisant un peu plus attentivement, j'ai trois autres petites remarques :

1) OpenSSL fournit une interface d'abstraction appelée BIO (Basic Input/Output, je crois) qui permet d'utiliser le même code pour gérer des sockets SSL et des sockets normaux, tu devrais y jeter un oeil çà allégerait un peu ton code :)

2) les fonctions winsock WSAStartup et WSACleanup sont appelées par OpenSSL, elles sont donc inutiles dans le corps de ton programme

3) il faut absolument initialiser le générateur de nombres aléatoires, sinon ta session SSL est théoriquement reproductible et vulnérable... Plus d'informations dans la doc, http://www.openssl.org/docs/crypto/RAND_add.html

signaler à un administrateur
Commentaire de neoTHGLF le 06/06/2005 17:50:42

Merci beaucoup pour ces remarques. Je vais modifier le SSL_v23_client_method, je ne savait pas qu'il existait des failles dans SSLv2. Pour la gestion des exceptions, malheureusement je ne comprends encore pas très bien la façon dont elles fonctionnent, je vais m'y atteler de plus près.
Pour les BIO, malheureusement, je trouve la documentation fournie sur le site www.openssl.org extrèmement obscure, je vais aussi m'y atteler (pour la énième fois) de plus près.
De même, je vais lire la doc sur le générateur de nombres aléatoires, il me semble effectivement que c'est un point clé vis à vis de la sécurité. Et ben, j'ai encore de nombreuses améliorations à faire ! ;) Je me souhaite bonne chance !
Cordialement.

signaler à un administrateur
Commentaire de neoTHGLF le 06/06/2005 18:47:23

Après avoir essayé de retirer WSAStartup et WSACleanup, le programme plante. Je pense donc que ces deux fonctions sont utiles.
Par ailleurs, je ne trouve aucune documentation sur l'utilisation des BIO, aurais tu une piste ?
De même, j'ai lu la doc pour le générateur de nombres aléatoires, et je ne sait pas si je dois le lancer une fois en début de programme ou bien si je dois le lancer à chaque fois que je transfère une donnée. En gros je comprends mal le fonctionnement/l'utilisation d'un générateur de nombres aléatoires, une piste aussi ?
Merci.
Cordialement.

signaler à un administrateur
Commentaire de Nebula le 08/06/2005 04:26:03

Hm bizarre, j'en avais pas eu besoin :-/

Pour les BIO tu peux commencer par ce site, qui dégrossit pas mal l'API (tout est en mode bloquant, si tu trouves en mode non-bloquant cela m'intéresse) : http://www-128.ibm.com/developerworks/linux/library/l-openssl.html

Je suis bien d'accord avec toi, la documentation d'OpenSSL est fouillis au possible et pour couronner le tout, elle est pas terminée... Mais c'est mieux que rien, et le dossier d'exemples vient la compléter ;-)

Pour le générateur de nombres aléatoires, tu l'initialises une fois au début de ton programme (au lancement par exemple, avant de créer tes connexions SSL), et puis c'est tout. Perso j'utilise rien sous Linux (il va chercher tout seul /dev/urandom ou /dev/random si le premier n'est pas disponible), et la CryptoAPI sous Windows pour en tirer un buffer de 2048 octets. Mais RAND_screen peut te suffire, si tu n'as pas besoin d'un truc très sécurisé.

Bon courage pour la suite !

signaler à un administrateur
Commentaire de sylvainmarechal le 08/06/2005 11:42:47

Bonjour,

Juste qq remarques concernant les BIO :
-le plus simple pour apprendre a utiliser les BIO est d'etudier le programme ssltest.c du repertoire ssl d'openssl

-L'utilisation des BIO est utile si on souhaite encripter un flux en memoire, ou bien par exemple utiliser les IOCP sous Windows. Dans le cas contraire, il est plus raisonnable d'utiliser openssl avec des socket bloquantes ou non bloquantes, avec l'api haut niveau (SSL_read, SSL_write etc...).

-Un tres bon exemple d'utilisation d'openssl + doc (socket bloquantes et non bloquantes) ici (pour linux mais facilement portable a windows) http://www.rtfm.com/openssl-examples/

Sylvain
---
http://sylvainmarechal.chez.tiscali.fr/

signaler à un administrateur
Commentaire de Klephte le 27/12/2005 13:43:33

Salut, bravo pour ce bel exemple de développement à base d'OpenSSL.

Si tu me le permets, je ferai néanmoins une remarque complémentaire concernant la lecture des données de la socket à l'aide de la fonction SSL_read car, tu dois ajouter un test complémentaire SSL_ERROR_WANT_READ afin de t'assurer que tu ne tentes pas un décryptage trop hâtif d'un buffer partiel.

Voici ce que j'ai écrit dans mon code à l'époque :
nBytes = SSL_read (conn.ssl, conn.acBuffer + conn.nCharsInBuffer,kBufferSize - conn.nCharsInBuffer - 1);
// Si SSL_read renvoie l'erreur SSL_ERROR_WANT_READ (code 2), cela signifie que l'api ssl a besoin
// de données complémentaires pour décoder le buffer, on effectue donc une relecture jusqu'à ce que
// cette erreur disparaisse

while ((nBytes==-1) && (SSL_get_error(conn.ssl,nBytes) == SSL_ERROR_WANT_READ)){
nBytes = SSL_read (conn.ssl, conn.acBuffer + conn.nCharsInBuffer,kBufferSize - conn.nCharsInBuffer - 1);
}

Pour vérifier que tout s'est bien passé alors j'utilise cette fonction :
SSL_get_error(conn.ssl,nBytes) == SSL_ERROR_NONE

Pour avoir le détail de l'erreur :
int sslerror = SSL_get_error(conn.ssl,nBytes);
char error_buffer[120];
ERR_error_string(sslerror, error_buffer,120);



Arnaud Grandville

signaler à un administrateur
Commentaire de menjra2000 le 06/03/2006 01:23:09

salut tout le monde je suis trop interesse pour faire marcher dess programmes utilisant les bibliotheques ssl mais je sais pas ou les trouver sur windows ( j'ai pas ses bibliotheques)

je veux savoir comment je peux faire marcher ce programme sous windows et VC++.

merci j'attends une reponse c'est urgent

signaler à un administrateur
Commentaire de sevgautok le 14/03/2006 12:26:13

Bonjour,
a mon tour de me lancer dans la securisation de mon appli client/serveur en utilisant SSL.
J'en viens a l'erreur SSL_ERROR_WANT_READ. Dans mon cas, elle apparait en retour de l'appel de SSL_accept. Mes sockets sont non bloquantes. Je n'arrive pas a me depatouiller de ca.
En gros j'ai mon client qui fait un SSL_connect et au niveau du serveur j'ai ce probleme.
Malgré tous les exemples que j'ai pu trouver sur le net, je n'ai pas reussi a resoundre ca.
Merci infiniment pour tout reponse.

signaler à un administrateur
Commentaire de djmoa le 09/04/2007 12:29:59

Salut a tous.
Cette classe me semble tout a fait bien, et surtout tres utile, bravo!
Mais néanmoins, j'ai un petit problème pour la faire fonctionner...
Je n'ai rien en lecture (0 octets lus)!!! voici mon petit code de test en mode non sécurisé (sachan que ca marche pas mieu en sécurisé...
    char buf[1024]
    client c;
    c.client_set(AF_INET,"64.233.183.103",80,false);
    if(c.client_connect()==2){
int ln;
     cout<<_T("connecté")<<endl;
ln=c.client_write("GET / HTTP/1.1\r\n\r\n");
     cout<<"envoyé: "<<ln<<endl;
ln=c.client_read(buf);
     cout<<"lu: "<<ln<<endl;
     cout<<buf<<endl;

sachant bien sur que la requete est correcte (fonctionne tres bien avec le meme code en MFC).
Merci de votre aide !

signaler à un administrateur
Commentaire de newzeh le 16/04/2007 14:49:08

Salut
J'ai telecharger ce code source client.cpp
j'ai simplement ecrit ce code source app.cpp:
#include "client.h"
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
using namespace std;
int main()
{
client *obj;
obj = new client();
obj->client_set(1,"192.168.1.1",443,1);
return 0;
}
//end
J'ai tapé au shell de linux la commande suivante:
g++ -Wall -c app.cpp
g++ -Wall -c client.cpp
c bon jusqu'ici
ensuite lorsque je tape cette commande: g++ app.o client.o -o app

j'ai ce message d'erreur:
/tmp/ccWh5xOV.o: In function `client::client_read(char*)':
client.cpp:(.text+0x11c): référence indéfinie vers « SSL_read »
/tmp/ccWh5xOV.o: In function `client::client_write(char*)':
client.cpp:(.text+0x208): référence indéfinie vers « SSL_write »
/tmp/ccWh5xOV.o: In function `client::client_connect()':
client.cpp:(.text+0x2e4): référence indéfinie vers « SSL_load_error_strings »
client.cpp:(.text+0x2e9): référence indéfinie vers « SSL_library_init »
client.cpp:(.text+0x2ee): référence indéfinie vers « SSLv23_client_method »
client.cpp:(.text+0x2fc): référence indéfinie vers « SSL_CTX_new »
client.cpp:(.text+0x30a): référence indéfinie vers « SSL_new »
client.cpp:(.text+0x357): référence indéfinie vers « SSL_set_fd »
client.cpp:(.text+0x3ac): référence indéfinie vers « SSL_connect »
collect2: ld returned 1 exit status

Merci d'avance de votre aide

signaler à un administrateur
Commentaire de neoTHGLF le 30/04/2007 09:57:58

Salut NEWZEH, essaye :
g++ -Wall -c app.cpp -lssl
g++ -Wall -c client.cpp -lssl

Cordialement.

signaler à un administrateur
Commentaire de neoTHGLF le 30/04/2007 10:25:23

Salut DjMoa,
Désolé pour le retard.

pour ma part le code que tu as tapé fonctionne très bien. Peut être le probleme se situe t'il autre part dans ton programme ?

Cordialement,

signaler à un administrateur
Commentaire de djmoa le 30/04/2007 10:55:42

ben justement, c'etait un programme de test, et a part les include et la déclaration du main, il n'y a rien d'autre...
En revanche, si le programme me dit que je ne recois rien, lorsque j'espionne avec ethereal, je vois bien la page de retour qui arrive dans l'ordi ...

la pauvre, elle doit etre fatiguée apres tout ce chemin a grande vitesse sur le net et elle c'est perdue en arrivant dans mon pc ... paix a son ame ...

J'essayerai sur un autre ordi, merci
pour les interesés, j'ai finalement fait mon prog en java, c'est tressssss simple. pensez y.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Tutorial - Socket, serveur, client BCPP + GUI [ par NyxArm ] Bonjours tout le monde, je suis présentement en période d'appretissage du language CPP sur Borland(v.6). Maintenant que j'ai acquis quelque conna Evènement sur un socket client [ par darsh99 ] J'aimerais savoir si la méthode utilisée par BlackGoddess pour son serveur (http://www.cppfrance.com/article.aspx?ID=1287) est récupérable pour gérer Thread et socket besoin de conseil [ par kawito ] Salut,je desire realiser un client/serveur TCPle probleme est que les fonctions accept et recv sont bloquante.donc cela bloque l'affichage etc...mon p programmation socket sous linux [ par blazman34 ] Bonjour à tous !!Voici mon probleme :Je suis en train de programmer une application client serveur sous linux, tout a bien marcher juska présent juska problème socket sous windows [ par kod32 ] Voici mon code : (winsock2.h)-----------------------------int main(){ /* inialisation */ WSADATA wsa; WSAStartup(MAKEWORD(2,0), &wsa); /* client & server [ par Stormy ] J'ai codé un serveur simple usant de TCP. Comme client j'utilise NetCat. Or, quand NetCat 'ferme', mon serveur ne détecte pas la clôture de la relatio Qd un Socket reçoit une trame erronée ... [ par valoue ] Bonjour,Je suis en train de développer una appli client serveur sous VC++, j'utilise des SOCKET.Le client et le serveur communiquent en s'envoyant des Client/Serveur, encore..... [ par glubust ] Je veux faire fonctionner une application client/serveur sous UNIX (client) et WINDOWS (serveur).Le programme client envoi une simple requête au serve connection client serveur avec MFC [ par Spiffou ] Bonjour à tous,j'avance petit à petit dans la programmation socket, mais je suis confronté à une nouvelle difficulté et j'ai une ou deux question sans Question socket - Client/Serveur [ par LordBob ] Bonjour a tous,alors voila je suis en train de developper un petit programme client/serveur... donc tout se passe bien, mon client se connecte parfait


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,515 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.