Page principale | Liste alphabétique | Liste des classes | Liste des fichiers | Membres de classe | Membres de fichier | Pages associées

NetClient.cpp

Aller à la documentation de ce fichier.
00001 /*! \file NetClient.cpp
00002     \brief Systeme client.
00003 
00004     Client pour le systeme serveur \a NetServeur.
00005 
00006     \author     aerith (http://aerith.fr)
00007     \version    2.0
00008     \date       22/05/2008
00009 */
00010 
00011 #include    "NetClient.h"
00012 
00013 NetClient::NetClient(unsigned int iCrypt)
00014 {
00015     conInfo     = NULL;
00016     crypt       = NET_T_NORMAL;
00017     TRY
00018 
00019 #if USE_SSL == 1
00020     sslCTX      = NULL;
00021     if(iCrypt == NET_T_SSL)
00022     {
00023         SSL_METHOD  *sslMethode;
00024 
00025         SSL_library_init();
00026         SSL_load_error_strings();
00027         sslMethode = SSLv23_server_method();
00028 
00029         sslCTX = SSL_CTX_new(sslMethode);
00030         if(!sslCTX)
00031             THROW(ERROR_C_SSLCTXINIT)
00032 
00033         crypt = NET_T_SSL;
00034     }
00035 #else
00036     if(iCrypt != NET_T_NORMAL)
00037         THROW(ERROR_C_NOSSL)
00038 #endif
00039     CATCH
00040 }
00041 
00042 NetClient::~NetClient()
00043 {
00044     Stop();
00045 }
00046 
00047 void    NetClient::Start(const char *pIp, unsigned int iPort)
00048 {
00049     struct hostent  *host;
00050     TRY
00051 
00052     if(conInfo)
00053         THROW(ERROR_C_ALREADY_START)
00054 
00055     conInfo = new NetConnect(crypt);
00056     conInfo->ip = pIp;
00057     conInfo->port = iPort;
00058 
00059     if(SocketLoad())
00060         THROW(ERROR_C_LOAD_DLL)
00061 
00062     conInfo->sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
00063     if(conInfo->sock < 0)
00064         THROW(ERROR_C_INIT_CONNECT)
00065 
00066     host = gethostbyname(conInfo->ip.data());
00067     if(!host)
00068         THROW(ERROR_C_URL_NOTFOUND)
00069 
00070     memset(&conInfo->sockName, 0, sizeof(conInfo->sockName));
00071     conInfo->sockName.sin_port = htons(conInfo->port);
00072     conInfo->sockName.sin_family = (*host).h_addrtype;
00073     conInfo->sockName.sin_addr = *((struct in_addr *)(*host).h_addr);
00074 
00075     if(connect(conInfo->sock, (const struct sockaddr *)&conInfo->sockName, sizeof(conInfo->sockName)))
00076         THROW(ERROR_C_CONNECT)
00077 
00078 #if USE_SSL == 1
00079     if(conInfo->crypt == NET_T_SSL)
00080     {
00081         conInfo->sslFD = SSL_new(sslCTX);
00082         if(!(conInfo->sslFD))
00083             THROW(ERROR_C_SSLINIT)
00084 
00085         if(SSL_set_fd(conInfo->sslFD, conInfo->sock) < 1)
00086             THROW(ERROR_C_SSLINIT)
00087 
00088         if(SSL_connect(conInfo->sslFD) < 1)
00089             THROW(ERROR_C_SSLCONNECT)
00090     }
00091 #endif
00092 
00093     CATCH
00094 }
00095 
00096 void    NetClient::Stop()
00097 {
00098     if(conInfo)
00099     {
00100         SocketClose(conInfo->sock);
00101         SocketUnLoad();
00102 
00103 #if USE_SSL == 1
00104         if(conInfo->crypt == NET_T_SSL)
00105         {
00106             SSL_shutdown(conInfo->sslFD);
00107             SSL_free(conInfo->sslFD);
00108         }
00109 #endif
00110         delete conInfo;
00111         conInfo = NULL;
00112     }
00113 }
00114 
00115 void    NetClient::Send(const char *pBuffer, ...)
00116 {
00117     char    temp[NET_BUFFER];
00118     va_list args;
00119 
00120     va_start(args, pBuffer);
00121     vsprintf(temp, pBuffer, args);
00122     va_end(args);
00123 
00124     conInfo->BinSend(temp, strlen(temp));
00125 };

Généré le Thu Jun 12 09:12:30 2008 pour A.I.F. par  doxygen 1.3.9.1