00001
00002
00003
00004
00005
00006
00007
00008
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 };